Completed
Branch FET/asset-manager (433489)
by
unknown
32:42 queued 18:11
created
core/libraries/rest_api/controllers/Base.php 2 patches
Indentation   +334 added lines, -334 removed lines patch added patch discarded remove patch
@@ -22,338 +22,338 @@
 block discarded – undo
22 22
 class Base
23 23
 {
24 24
 
25
-    /**
26
-     * @deprecated use all-caps version
27
-     */
28
-    // @codingStandardsIgnoreStart
29
-    const header_prefix_for_ee = 'X-EE-';
30
-    // @codingStandardsIgnoreEnd
31
-
32
-    const HEADER_PREFIX_FOR_EE = 'X-EE-';
33
-
34
-    /**
35
-     * @deprecated use all-caps version instead
36
-     */
37
-    // @codingStandardsIgnoreStart
38
-    const header_prefix_for_wp = 'X-WP-';
39
-    // @codingStandardsIgnoreEnd
40
-
41
-    const HEADER_PREFIX_FOR_WP = 'X-WP-';
42
-
43
-    /**
44
-     * Contains debug info we'll send back in the response headers
45
-     *
46
-     * @var array
47
-     */
48
-    protected $debug_info = array();
49
-
50
-    /**
51
-     * Indicates whether or not the API is in debug mode
52
-     *
53
-     * @var boolean
54
-     */
55
-    protected $debug_mode = false;
56
-
57
-    /**
58
-     * Indicates the version that was requested
59
-     *
60
-     * @var string
61
-     */
62
-    protected $requested_version;
63
-
64
-    /**
65
-     * flat array of headers to send in the response
66
-     *
67
-     * @var array
68
-     */
69
-    protected $response_headers = array();
70
-
71
-
72
-    public function __construct()
73
-    {
74
-        $this->debug_mode = defined('EE_REST_API_DEBUG_MODE') ? EE_REST_API_DEBUG_MODE : false;
75
-        // we are handling a REST request. Don't show a fancy HTML error message is any error comes up
76
-        add_filter('FHEE__EE_Error__get_error__show_normal_exceptions', '__return_true');
77
-    }
78
-
79
-
80
-    /**
81
-     * Sets the version the user requested
82
-     *
83
-     * @param string $version eg '4.8'
84
-     */
85
-    public function setRequestedVersion($version)
86
-    {
87
-        $this->requested_version = $version;
88
-    }
89
-
90
-
91
-    /**
92
-     * Sets some debug info that we'll send back in headers
93
-     *
94
-     * @param string       $key
95
-     * @param string|array $info
96
-     */
97
-    protected function setDebugInfo($key, $info)
98
-    {
99
-        $this->debug_info[ $key ] = $info;
100
-    }
101
-
102
-
103
-    /**
104
-     * Sets headers for the response
105
-     *
106
-     * @param string       $header_key    , excluding the "X-EE-" part
107
-     * @param array|string $value         if an array, multiple headers will be added, one
108
-     *                                    for each key in the array
109
-     * @param boolean      $use_ee_prefix whether to use the EE prefix on the header, or fallback to
110
-     *                                    the standard WP one
111
-     */
112
-    protected function setResponseHeader($header_key, $value, $use_ee_prefix = true)
113
-    {
114
-        if (is_array($value)) {
115
-            foreach ($value as $value_key => $value_value) {
116
-                $this->setResponseHeader($header_key . '[' . $value_key . ']', $value_value);
117
-            }
118
-        } else {
119
-            $prefix = $use_ee_prefix ? Base::HEADER_PREFIX_FOR_EE : Base::HEADER_PREFIX_FOR_WP;
120
-            $this->response_headers[ $prefix . $header_key ] = $value;
121
-        }
122
-    }
123
-
124
-
125
-    /**
126
-     * Returns a flat array of headers to be added to the response
127
-     *
128
-     * @return array
129
-     */
130
-    protected function getResponseHeaders()
131
-    {
132
-        return apply_filters(
133
-            'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_response_headers',
134
-            $this->response_headers,
135
-            $this,
136
-            $this->requested_version
137
-        );
138
-    }
139
-
140
-
141
-    /**
142
-     * Adds error notices from EE_Error onto the provided \WP_Error
143
-     *
144
-     * @param WP_Error $wp_error_response
145
-     * @return WP_Error
146
-     */
147
-    protected function addEeErrorsToResponse(WP_Error $wp_error_response)
148
-    {
149
-        $notices_during_checkin = EE_Error::get_raw_notices();
150
-        if (! empty($notices_during_checkin['errors'])) {
151
-            foreach ($notices_during_checkin['errors'] as $error_code => $error_message) {
152
-                $wp_error_response->add(
153
-                    sanitize_key($error_code),
154
-                    strip_tags($error_message)
155
-                );
156
-            }
157
-        }
158
-        return $wp_error_response;
159
-    }
160
-
161
-
162
-    /**
163
-     * Sends a response, but also makes sure to attach headers that
164
-     * are handy for debugging.
165
-     * Specifically, we assume folks will want to know what exactly was the DB query that got run,
166
-     * what exactly was the Models query that got run, what capabilities came into play, what fields were omitted from
167
-     * the response, others?
168
-     *
169
-     * @param array|WP_Error|Exception|RestException $response
170
-     * @return WP_REST_Response
171
-     */
172
-    public function sendResponse($response)
173
-    {
174
-        if ($response instanceof RestException) {
175
-            $response = new WP_Error($response->getStringCode(), $response->getMessage(), $response->getData());
176
-        }
177
-        if ($response instanceof Exception) {
178
-            $code = $response->getCode() ? $response->getCode() : 'error_occurred';
179
-            $response = new WP_Error($code, $response->getMessage());
180
-        }
181
-        if ($response instanceof WP_Error) {
182
-            $response = $this->addEeErrorsToResponse($response);
183
-            $rest_response = $this->createRestResponseFromWpError($response);
184
-        } else {
185
-            $rest_response = new WP_REST_Response($response, 200);
186
-        }
187
-        $headers = array();
188
-        if ($this->debug_mode && is_array($this->debug_info)) {
189
-            foreach ($this->debug_info as $debug_key => $debug_info) {
190
-                if (is_array($debug_info)) {
191
-                    $debug_info = wp_json_encode($debug_info);
192
-                }
193
-                $headers[ 'X-EE4-Debug-' . ucwords($debug_key) ] = $debug_info;
194
-            }
195
-        }
196
-        $headers = array_merge(
197
-            $headers,
198
-            $this->getResponseHeaders(),
199
-            $this->getHeadersFromEeNotices()
200
-        );
201
-        $rest_response->set_headers($headers);
202
-        return $rest_response;
203
-    }
204
-
205
-
206
-    /**
207
-     * Converts the \WP_Error into `WP_REST_Response.
208
-     * Mostly this is just a copy-and-paste from \WP_REST_Server::error_to_response
209
-     * (which is protected)
210
-     *
211
-     * @param WP_Error $wp_error
212
-     * @return WP_REST_Response
213
-     */
214
-    protected function createRestResponseFromWpError(WP_Error $wp_error)
215
-    {
216
-        $error_data = $wp_error->get_error_data();
217
-        if (is_array($error_data) && isset($error_data['status'])) {
218
-            $status = $error_data['status'];
219
-        } else {
220
-            $status = 500;
221
-        }
222
-        $errors = array();
223
-        foreach ((array) $wp_error->errors as $code => $messages) {
224
-            foreach ((array) $messages as $message) {
225
-                $errors[] = array(
226
-                    'code'    => $code,
227
-                    'message' => $message,
228
-                    'data'    => $wp_error->get_error_data($code),
229
-                );
230
-            }
231
-        }
232
-        $data = isset($errors[0]) ? $errors[0] : array();
233
-        if (count($errors) > 1) {
234
-            // Remove the primary error.
235
-            array_shift($errors);
236
-            $data['additional_errors'] = $errors;
237
-        }
238
-        return new WP_REST_Response($data, $status);
239
-    }
240
-
241
-
242
-    /**
243
-     * Array of headers derived from EE success, attention, and error messages
244
-     *
245
-     * @return array
246
-     */
247
-    protected function getHeadersFromEeNotices()
248
-    {
249
-        $headers = array();
250
-        $notices = EE_Error::get_raw_notices();
251
-        foreach ($notices as $notice_type => $sub_notices) {
252
-            if (! is_array($sub_notices)) {
253
-                continue;
254
-            }
255
-            foreach ($sub_notices as $notice_code => $sub_notice) {
256
-                $headers[ 'X-EE4-Notices-'
257
-                          . EEH_Inflector::humanize($notice_type)
258
-                          . '['
259
-                          . $notice_code
260
-                          . ']' ] = strip_tags($sub_notice);
261
-            }
262
-        }
263
-        return apply_filters(
264
-            'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_headers_from_ee_notices__return',
265
-            $headers,
266
-            $this->requested_version,
267
-            $notices
268
-        );
269
-    }
270
-
271
-
272
-    /**
273
-     * Finds which version of the API was requested given the route, and returns it.
274
-     * eg in a request to "mysite.com/wp-json/ee/v4.8.29/events/123" this would return
275
-     * "4.8.29".
276
-     * We should know hte requested version in this model though, so if no route is
277
-     * provided just use what we set earlier
278
-     *
279
-     * @param string $route
280
-     * @return string
281
-     */
282
-    public function getRequestedVersion($route = null)
283
-    {
284
-        if ($route === null) {
285
-            return $this->requested_version;
286
-        }
287
-        $matches = $this->parseRoute(
288
-            $route,
289
-            '~' . EED_Core_Rest_Api::ee_api_namespace_for_regex . '~',
290
-            array('version')
291
-        );
292
-        if (isset($matches['version'])) {
293
-            return $matches['version'];
294
-        } else {
295
-            return EED_Core_Rest_Api::latest_rest_api_version();
296
-        }
297
-    }
298
-
299
-
300
-    /**
301
-     * Applies the regex to the route, then creates an array using the values of
302
-     * $match_keys as keys (but ignores the full pattern match). Returns the array of matches.
303
-     * For example, if you call
304
-     * parse_route( '/ee/v4.8/events', '~\/ee\/v([^/]*)\/(.*)~', array( 'version', 'model' ) )
305
-     * it will return array( 'version' => '4.8', 'model' => 'events' )
306
-     *
307
-     * @param string $route
308
-     * @param string $regex
309
-     * @param array  $match_keys EXCLUDING matching the entire regex
310
-     * @return array where  $match_keys are the keys (the first value of $match_keys
311
-     *                           becomes the first key of the return value, etc. Eg passing in $match_keys of
312
-     *                           array( 'model', 'id' ), will, if the regex is successful, will return
313
-     *                           array( 'model' => 'foo', 'id' => 'bar' )
314
-     * @throws EE_Error if it couldn't be parsed
315
-     */
316
-    public function parseRoute($route, $regex, $match_keys)
317
-    {
318
-        $indexed_matches = array();
319
-        $success = preg_match($regex, $route, $matches);
320
-        if (is_array($matches)) {
321
-            // skip the overall regex match. Who cares
322
-            for ($i = 1; $i <= count($match_keys); $i++) {
323
-                if (! isset($matches[ $i ])) {
324
-                    $success = false;
325
-                } else {
326
-                    $indexed_matches[ $match_keys[ $i - 1 ] ] = $matches[ $i ];
327
-                }
328
-            }
329
-        }
330
-        if (! $success) {
331
-            throw new EE_Error(
332
-                __('We could not parse the URL. Please contact Event Espresso Support', 'event_espresso'),
333
-                'endpoint_parsing_error'
334
-            );
335
-        }
336
-        return $indexed_matches;
337
-    }
338
-
339
-
340
-    /**
341
-     * Gets the body's params (either from JSON or parsed body), which EXCLUDES the GET params and URL params
342
-     *
343
-     * @param \WP_REST_Request $request
344
-     * @return array
345
-     */
346
-    protected function getBodyParams(\WP_REST_Request $request)
347
-    {
348
-        // $request->get_params();
349
-        return array_merge(
350
-            (array) $request->get_body_params(),
351
-            (array) $request->get_json_params()
352
-        );
353
-        // return array_diff_key(
354
-        //    $request->get_params(),
355
-        //     $request->get_url_params(),
356
-        //     $request->get_query_params()
357
-        // );
358
-    }
25
+	/**
26
+	 * @deprecated use all-caps version
27
+	 */
28
+	// @codingStandardsIgnoreStart
29
+	const header_prefix_for_ee = 'X-EE-';
30
+	// @codingStandardsIgnoreEnd
31
+
32
+	const HEADER_PREFIX_FOR_EE = 'X-EE-';
33
+
34
+	/**
35
+	 * @deprecated use all-caps version instead
36
+	 */
37
+	// @codingStandardsIgnoreStart
38
+	const header_prefix_for_wp = 'X-WP-';
39
+	// @codingStandardsIgnoreEnd
40
+
41
+	const HEADER_PREFIX_FOR_WP = 'X-WP-';
42
+
43
+	/**
44
+	 * Contains debug info we'll send back in the response headers
45
+	 *
46
+	 * @var array
47
+	 */
48
+	protected $debug_info = array();
49
+
50
+	/**
51
+	 * Indicates whether or not the API is in debug mode
52
+	 *
53
+	 * @var boolean
54
+	 */
55
+	protected $debug_mode = false;
56
+
57
+	/**
58
+	 * Indicates the version that was requested
59
+	 *
60
+	 * @var string
61
+	 */
62
+	protected $requested_version;
63
+
64
+	/**
65
+	 * flat array of headers to send in the response
66
+	 *
67
+	 * @var array
68
+	 */
69
+	protected $response_headers = array();
70
+
71
+
72
+	public function __construct()
73
+	{
74
+		$this->debug_mode = defined('EE_REST_API_DEBUG_MODE') ? EE_REST_API_DEBUG_MODE : false;
75
+		// we are handling a REST request. Don't show a fancy HTML error message is any error comes up
76
+		add_filter('FHEE__EE_Error__get_error__show_normal_exceptions', '__return_true');
77
+	}
78
+
79
+
80
+	/**
81
+	 * Sets the version the user requested
82
+	 *
83
+	 * @param string $version eg '4.8'
84
+	 */
85
+	public function setRequestedVersion($version)
86
+	{
87
+		$this->requested_version = $version;
88
+	}
89
+
90
+
91
+	/**
92
+	 * Sets some debug info that we'll send back in headers
93
+	 *
94
+	 * @param string       $key
95
+	 * @param string|array $info
96
+	 */
97
+	protected function setDebugInfo($key, $info)
98
+	{
99
+		$this->debug_info[ $key ] = $info;
100
+	}
101
+
102
+
103
+	/**
104
+	 * Sets headers for the response
105
+	 *
106
+	 * @param string       $header_key    , excluding the "X-EE-" part
107
+	 * @param array|string $value         if an array, multiple headers will be added, one
108
+	 *                                    for each key in the array
109
+	 * @param boolean      $use_ee_prefix whether to use the EE prefix on the header, or fallback to
110
+	 *                                    the standard WP one
111
+	 */
112
+	protected function setResponseHeader($header_key, $value, $use_ee_prefix = true)
113
+	{
114
+		if (is_array($value)) {
115
+			foreach ($value as $value_key => $value_value) {
116
+				$this->setResponseHeader($header_key . '[' . $value_key . ']', $value_value);
117
+			}
118
+		} else {
119
+			$prefix = $use_ee_prefix ? Base::HEADER_PREFIX_FOR_EE : Base::HEADER_PREFIX_FOR_WP;
120
+			$this->response_headers[ $prefix . $header_key ] = $value;
121
+		}
122
+	}
123
+
124
+
125
+	/**
126
+	 * Returns a flat array of headers to be added to the response
127
+	 *
128
+	 * @return array
129
+	 */
130
+	protected function getResponseHeaders()
131
+	{
132
+		return apply_filters(
133
+			'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_response_headers',
134
+			$this->response_headers,
135
+			$this,
136
+			$this->requested_version
137
+		);
138
+	}
139
+
140
+
141
+	/**
142
+	 * Adds error notices from EE_Error onto the provided \WP_Error
143
+	 *
144
+	 * @param WP_Error $wp_error_response
145
+	 * @return WP_Error
146
+	 */
147
+	protected function addEeErrorsToResponse(WP_Error $wp_error_response)
148
+	{
149
+		$notices_during_checkin = EE_Error::get_raw_notices();
150
+		if (! empty($notices_during_checkin['errors'])) {
151
+			foreach ($notices_during_checkin['errors'] as $error_code => $error_message) {
152
+				$wp_error_response->add(
153
+					sanitize_key($error_code),
154
+					strip_tags($error_message)
155
+				);
156
+			}
157
+		}
158
+		return $wp_error_response;
159
+	}
160
+
161
+
162
+	/**
163
+	 * Sends a response, but also makes sure to attach headers that
164
+	 * are handy for debugging.
165
+	 * Specifically, we assume folks will want to know what exactly was the DB query that got run,
166
+	 * what exactly was the Models query that got run, what capabilities came into play, what fields were omitted from
167
+	 * the response, others?
168
+	 *
169
+	 * @param array|WP_Error|Exception|RestException $response
170
+	 * @return WP_REST_Response
171
+	 */
172
+	public function sendResponse($response)
173
+	{
174
+		if ($response instanceof RestException) {
175
+			$response = new WP_Error($response->getStringCode(), $response->getMessage(), $response->getData());
176
+		}
177
+		if ($response instanceof Exception) {
178
+			$code = $response->getCode() ? $response->getCode() : 'error_occurred';
179
+			$response = new WP_Error($code, $response->getMessage());
180
+		}
181
+		if ($response instanceof WP_Error) {
182
+			$response = $this->addEeErrorsToResponse($response);
183
+			$rest_response = $this->createRestResponseFromWpError($response);
184
+		} else {
185
+			$rest_response = new WP_REST_Response($response, 200);
186
+		}
187
+		$headers = array();
188
+		if ($this->debug_mode && is_array($this->debug_info)) {
189
+			foreach ($this->debug_info as $debug_key => $debug_info) {
190
+				if (is_array($debug_info)) {
191
+					$debug_info = wp_json_encode($debug_info);
192
+				}
193
+				$headers[ 'X-EE4-Debug-' . ucwords($debug_key) ] = $debug_info;
194
+			}
195
+		}
196
+		$headers = array_merge(
197
+			$headers,
198
+			$this->getResponseHeaders(),
199
+			$this->getHeadersFromEeNotices()
200
+		);
201
+		$rest_response->set_headers($headers);
202
+		return $rest_response;
203
+	}
204
+
205
+
206
+	/**
207
+	 * Converts the \WP_Error into `WP_REST_Response.
208
+	 * Mostly this is just a copy-and-paste from \WP_REST_Server::error_to_response
209
+	 * (which is protected)
210
+	 *
211
+	 * @param WP_Error $wp_error
212
+	 * @return WP_REST_Response
213
+	 */
214
+	protected function createRestResponseFromWpError(WP_Error $wp_error)
215
+	{
216
+		$error_data = $wp_error->get_error_data();
217
+		if (is_array($error_data) && isset($error_data['status'])) {
218
+			$status = $error_data['status'];
219
+		} else {
220
+			$status = 500;
221
+		}
222
+		$errors = array();
223
+		foreach ((array) $wp_error->errors as $code => $messages) {
224
+			foreach ((array) $messages as $message) {
225
+				$errors[] = array(
226
+					'code'    => $code,
227
+					'message' => $message,
228
+					'data'    => $wp_error->get_error_data($code),
229
+				);
230
+			}
231
+		}
232
+		$data = isset($errors[0]) ? $errors[0] : array();
233
+		if (count($errors) > 1) {
234
+			// Remove the primary error.
235
+			array_shift($errors);
236
+			$data['additional_errors'] = $errors;
237
+		}
238
+		return new WP_REST_Response($data, $status);
239
+	}
240
+
241
+
242
+	/**
243
+	 * Array of headers derived from EE success, attention, and error messages
244
+	 *
245
+	 * @return array
246
+	 */
247
+	protected function getHeadersFromEeNotices()
248
+	{
249
+		$headers = array();
250
+		$notices = EE_Error::get_raw_notices();
251
+		foreach ($notices as $notice_type => $sub_notices) {
252
+			if (! is_array($sub_notices)) {
253
+				continue;
254
+			}
255
+			foreach ($sub_notices as $notice_code => $sub_notice) {
256
+				$headers[ 'X-EE4-Notices-'
257
+						  . EEH_Inflector::humanize($notice_type)
258
+						  . '['
259
+						  . $notice_code
260
+						  . ']' ] = strip_tags($sub_notice);
261
+			}
262
+		}
263
+		return apply_filters(
264
+			'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_headers_from_ee_notices__return',
265
+			$headers,
266
+			$this->requested_version,
267
+			$notices
268
+		);
269
+	}
270
+
271
+
272
+	/**
273
+	 * Finds which version of the API was requested given the route, and returns it.
274
+	 * eg in a request to "mysite.com/wp-json/ee/v4.8.29/events/123" this would return
275
+	 * "4.8.29".
276
+	 * We should know hte requested version in this model though, so if no route is
277
+	 * provided just use what we set earlier
278
+	 *
279
+	 * @param string $route
280
+	 * @return string
281
+	 */
282
+	public function getRequestedVersion($route = null)
283
+	{
284
+		if ($route === null) {
285
+			return $this->requested_version;
286
+		}
287
+		$matches = $this->parseRoute(
288
+			$route,
289
+			'~' . EED_Core_Rest_Api::ee_api_namespace_for_regex . '~',
290
+			array('version')
291
+		);
292
+		if (isset($matches['version'])) {
293
+			return $matches['version'];
294
+		} else {
295
+			return EED_Core_Rest_Api::latest_rest_api_version();
296
+		}
297
+	}
298
+
299
+
300
+	/**
301
+	 * Applies the regex to the route, then creates an array using the values of
302
+	 * $match_keys as keys (but ignores the full pattern match). Returns the array of matches.
303
+	 * For example, if you call
304
+	 * parse_route( '/ee/v4.8/events', '~\/ee\/v([^/]*)\/(.*)~', array( 'version', 'model' ) )
305
+	 * it will return array( 'version' => '4.8', 'model' => 'events' )
306
+	 *
307
+	 * @param string $route
308
+	 * @param string $regex
309
+	 * @param array  $match_keys EXCLUDING matching the entire regex
310
+	 * @return array where  $match_keys are the keys (the first value of $match_keys
311
+	 *                           becomes the first key of the return value, etc. Eg passing in $match_keys of
312
+	 *                           array( 'model', 'id' ), will, if the regex is successful, will return
313
+	 *                           array( 'model' => 'foo', 'id' => 'bar' )
314
+	 * @throws EE_Error if it couldn't be parsed
315
+	 */
316
+	public function parseRoute($route, $regex, $match_keys)
317
+	{
318
+		$indexed_matches = array();
319
+		$success = preg_match($regex, $route, $matches);
320
+		if (is_array($matches)) {
321
+			// skip the overall regex match. Who cares
322
+			for ($i = 1; $i <= count($match_keys); $i++) {
323
+				if (! isset($matches[ $i ])) {
324
+					$success = false;
325
+				} else {
326
+					$indexed_matches[ $match_keys[ $i - 1 ] ] = $matches[ $i ];
327
+				}
328
+			}
329
+		}
330
+		if (! $success) {
331
+			throw new EE_Error(
332
+				__('We could not parse the URL. Please contact Event Espresso Support', 'event_espresso'),
333
+				'endpoint_parsing_error'
334
+			);
335
+		}
336
+		return $indexed_matches;
337
+	}
338
+
339
+
340
+	/**
341
+	 * Gets the body's params (either from JSON or parsed body), which EXCLUDES the GET params and URL params
342
+	 *
343
+	 * @param \WP_REST_Request $request
344
+	 * @return array
345
+	 */
346
+	protected function getBodyParams(\WP_REST_Request $request)
347
+	{
348
+		// $request->get_params();
349
+		return array_merge(
350
+			(array) $request->get_body_params(),
351
+			(array) $request->get_json_params()
352
+		);
353
+		// return array_diff_key(
354
+		//    $request->get_params(),
355
+		//     $request->get_url_params(),
356
+		//     $request->get_query_params()
357
+		// );
358
+	}
359 359
 }
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -96,7 +96,7 @@  discard block
 block discarded – undo
96 96
      */
97 97
     protected function setDebugInfo($key, $info)
98 98
     {
99
-        $this->debug_info[ $key ] = $info;
99
+        $this->debug_info[$key] = $info;
100 100
     }
101 101
 
102 102
 
@@ -113,11 +113,11 @@  discard block
 block discarded – undo
113 113
     {
114 114
         if (is_array($value)) {
115 115
             foreach ($value as $value_key => $value_value) {
116
-                $this->setResponseHeader($header_key . '[' . $value_key . ']', $value_value);
116
+                $this->setResponseHeader($header_key.'['.$value_key.']', $value_value);
117 117
             }
118 118
         } else {
119 119
             $prefix = $use_ee_prefix ? Base::HEADER_PREFIX_FOR_EE : Base::HEADER_PREFIX_FOR_WP;
120
-            $this->response_headers[ $prefix . $header_key ] = $value;
120
+            $this->response_headers[$prefix.$header_key] = $value;
121 121
         }
122 122
     }
123 123
 
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
     protected function addEeErrorsToResponse(WP_Error $wp_error_response)
148 148
     {
149 149
         $notices_during_checkin = EE_Error::get_raw_notices();
150
-        if (! empty($notices_during_checkin['errors'])) {
150
+        if ( ! empty($notices_during_checkin['errors'])) {
151 151
             foreach ($notices_during_checkin['errors'] as $error_code => $error_message) {
152 152
                 $wp_error_response->add(
153 153
                     sanitize_key($error_code),
@@ -190,7 +190,7 @@  discard block
 block discarded – undo
190 190
                 if (is_array($debug_info)) {
191 191
                     $debug_info = wp_json_encode($debug_info);
192 192
                 }
193
-                $headers[ 'X-EE4-Debug-' . ucwords($debug_key) ] = $debug_info;
193
+                $headers['X-EE4-Debug-'.ucwords($debug_key)] = $debug_info;
194 194
             }
195 195
         }
196 196
         $headers = array_merge(
@@ -249,15 +249,15 @@  discard block
 block discarded – undo
249 249
         $headers = array();
250 250
         $notices = EE_Error::get_raw_notices();
251 251
         foreach ($notices as $notice_type => $sub_notices) {
252
-            if (! is_array($sub_notices)) {
252
+            if ( ! is_array($sub_notices)) {
253 253
                 continue;
254 254
             }
255 255
             foreach ($sub_notices as $notice_code => $sub_notice) {
256
-                $headers[ 'X-EE4-Notices-'
256
+                $headers['X-EE4-Notices-'
257 257
                           . EEH_Inflector::humanize($notice_type)
258 258
                           . '['
259 259
                           . $notice_code
260
-                          . ']' ] = strip_tags($sub_notice);
260
+                          . ']'] = strip_tags($sub_notice);
261 261
             }
262 262
         }
263 263
         return apply_filters(
@@ -286,7 +286,7 @@  discard block
 block discarded – undo
286 286
         }
287 287
         $matches = $this->parseRoute(
288 288
             $route,
289
-            '~' . EED_Core_Rest_Api::ee_api_namespace_for_regex . '~',
289
+            '~'.EED_Core_Rest_Api::ee_api_namespace_for_regex.'~',
290 290
             array('version')
291 291
         );
292 292
         if (isset($matches['version'])) {
@@ -320,14 +320,14 @@  discard block
 block discarded – undo
320 320
         if (is_array($matches)) {
321 321
             // skip the overall regex match. Who cares
322 322
             for ($i = 1; $i <= count($match_keys); $i++) {
323
-                if (! isset($matches[ $i ])) {
323
+                if ( ! isset($matches[$i])) {
324 324
                     $success = false;
325 325
                 } else {
326
-                    $indexed_matches[ $match_keys[ $i - 1 ] ] = $matches[ $i ];
326
+                    $indexed_matches[$match_keys[$i - 1]] = $matches[$i];
327 327
                 }
328 328
             }
329 329
         }
330
-        if (! $success) {
330
+        if ( ! $success) {
331 331
             throw new EE_Error(
332 332
                 __('We could not parse the URL. Please contact Event Espresso Support', 'event_espresso'),
333 333
                 'endpoint_parsing_error'
Please login to merge, or discard this patch.
core/libraries/rest_api/controllers/config/Read.php 1 patch
Indentation   +77 added lines, -77 removed lines patch added patch discarded remove patch
@@ -20,85 +20,85 @@
 block discarded – undo
20 20
 class Read
21 21
 {
22 22
 
23
-    /**
24
-     * @param WP_REST_Request $request
25
-     * @param string          $version
26
-     * @return EE_Config|WP_Error
27
-     */
28
-    public static function handleRequest(WP_REST_Request $request, $version)
29
-    {
30
-        $cap = EE_Restriction_Generator_Base::get_default_restrictions_cap();
31
-        if (EE_Capabilities::instance()->current_user_can($cap, 'read_over_api')) {
32
-            return EE_Config::instance();
33
-        } else {
34
-            return new WP_Error(
35
-                'cannot_read_config',
36
-                sprintf(
37
-                    __(
38
-                        'You do not have the necessary capabilities (%s) to read Event Espresso Configuration data',
39
-                        'event_espresso'
40
-                    ),
41
-                    $cap
42
-                ),
43
-                array('status' => 403)
44
-            );
45
-        }
46
-    }
23
+	/**
24
+	 * @param WP_REST_Request $request
25
+	 * @param string          $version
26
+	 * @return EE_Config|WP_Error
27
+	 */
28
+	public static function handleRequest(WP_REST_Request $request, $version)
29
+	{
30
+		$cap = EE_Restriction_Generator_Base::get_default_restrictions_cap();
31
+		if (EE_Capabilities::instance()->current_user_can($cap, 'read_over_api')) {
32
+			return EE_Config::instance();
33
+		} else {
34
+			return new WP_Error(
35
+				'cannot_read_config',
36
+				sprintf(
37
+					__(
38
+						'You do not have the necessary capabilities (%s) to read Event Espresso Configuration data',
39
+						'event_espresso'
40
+					),
41
+					$cap
42
+				),
43
+				array('status' => 403)
44
+			);
45
+		}
46
+	}
47 47
 
48 48
 
49
-    /**
50
-     * Handles the request for public site info
51
-     *
52
-     * @global                 $wp_json_basic_auth_success       boolean set by the basic auth plugin, indicates if the
53
-     *                                                           current user could be authenticated using basic auth
54
-     *                                                           data
55
-     * @global                 $wp_json_basic_auth_received_data boolean set by the basic auth plugin, indicates if
56
-     *                                                           basic auth data was somehow received
57
-     * @param WP_REST_Request  $request
58
-     * @param string           $version
59
-     * @return array|WP_Error
60
-     */
61
-    public static function handleRequestSiteInfo(WP_REST_Request $request, $version)
62
-    {
63
-        global $wp_json_basic_auth_success, $wp_json_basic_auth_received_data;
64
-        $insecure_usage_of_basic_auth = apply_filters(
65
-        // @codingStandardsIgnoreStart
66
-            'EventEspresso__core__libraries__rest_api__controllers__config__handle_request_site_info__insecure_usage_of_basic_auth',
67
-            // @codingStandardsIgnoreEnd
68
-            $wp_json_basic_auth_success && ! is_ssl(),
69
-            $request
70
-        );
71
-        if ($insecure_usage_of_basic_auth) {
72
-            $warning = sprintf(
73
-                esc_html__(
74
-                // @codingStandardsIgnoreStart
75
-                    'Notice: We strongly recommend installing an SSL Certificate on your website to keep your data secure. %1$sPlease see our recommendations.%2$s',
76
-                    // @codingStandardsIgnoreEnd
77
-                    'event_espresso'
78
-                ),
79
-                '<a href="https://eventespresso.com/wiki/rest-api-security-recommendations/">',
80
-                '</a>'
81
-            );
82
-        } else {
83
-            $warning = '';
84
-        }
85
-        return apply_filters(
86
-            'FHEE__EventEspresso_core_libraries_rest_api_controllers_config__handleRequestSiteInfo__return_val',
87
-            array(
88
-                'default_timezone' => array(
89
-                    'pretty' => EEH_DTT_Helper::get_timezone_string_for_display(),
90
-                    'string' => get_option('timezone_string'),
91
-                    'offset' => EEH_DTT_Helper::get_site_timezone_gmt_offset(),
92
-                ),
93
-                'default_currency' => EE_Config::instance()->currency,
94
-                'authentication'   => array(
95
-                    'received_basic_auth_data'     => (bool) $wp_json_basic_auth_received_data,
96
-                    'insecure_usage_of_basic_auth' => (bool) $insecure_usage_of_basic_auth,
97
-                    'warning'                      => $warning,
98
-                ),
99
-            )
100
-        );
101
-    }
49
+	/**
50
+	 * Handles the request for public site info
51
+	 *
52
+	 * @global                 $wp_json_basic_auth_success       boolean set by the basic auth plugin, indicates if the
53
+	 *                                                           current user could be authenticated using basic auth
54
+	 *                                                           data
55
+	 * @global                 $wp_json_basic_auth_received_data boolean set by the basic auth plugin, indicates if
56
+	 *                                                           basic auth data was somehow received
57
+	 * @param WP_REST_Request  $request
58
+	 * @param string           $version
59
+	 * @return array|WP_Error
60
+	 */
61
+	public static function handleRequestSiteInfo(WP_REST_Request $request, $version)
62
+	{
63
+		global $wp_json_basic_auth_success, $wp_json_basic_auth_received_data;
64
+		$insecure_usage_of_basic_auth = apply_filters(
65
+		// @codingStandardsIgnoreStart
66
+			'EventEspresso__core__libraries__rest_api__controllers__config__handle_request_site_info__insecure_usage_of_basic_auth',
67
+			// @codingStandardsIgnoreEnd
68
+			$wp_json_basic_auth_success && ! is_ssl(),
69
+			$request
70
+		);
71
+		if ($insecure_usage_of_basic_auth) {
72
+			$warning = sprintf(
73
+				esc_html__(
74
+				// @codingStandardsIgnoreStart
75
+					'Notice: We strongly recommend installing an SSL Certificate on your website to keep your data secure. %1$sPlease see our recommendations.%2$s',
76
+					// @codingStandardsIgnoreEnd
77
+					'event_espresso'
78
+				),
79
+				'<a href="https://eventespresso.com/wiki/rest-api-security-recommendations/">',
80
+				'</a>'
81
+			);
82
+		} else {
83
+			$warning = '';
84
+		}
85
+		return apply_filters(
86
+			'FHEE__EventEspresso_core_libraries_rest_api_controllers_config__handleRequestSiteInfo__return_val',
87
+			array(
88
+				'default_timezone' => array(
89
+					'pretty' => EEH_DTT_Helper::get_timezone_string_for_display(),
90
+					'string' => get_option('timezone_string'),
91
+					'offset' => EEH_DTT_Helper::get_site_timezone_gmt_offset(),
92
+				),
93
+				'default_currency' => EE_Config::instance()->currency,
94
+				'authentication'   => array(
95
+					'received_basic_auth_data'     => (bool) $wp_json_basic_auth_received_data,
96
+					'insecure_usage_of_basic_auth' => (bool) $insecure_usage_of_basic_auth,
97
+					'warning'                      => $warning,
98
+				),
99
+			)
100
+		);
101
+	}
102 102
 }
103 103
 
104 104
 // End of file Read.php
Please login to merge, or discard this patch.
core/libraries/rest_api/controllers/model/Write.php 2 patches
Indentation   +305 added lines, -305 removed lines patch added patch discarded remove patch
@@ -30,325 +30,325 @@
 block discarded – undo
30 30
 {
31 31
 
32 32
 
33
-    public function __construct()
34
-    {
35
-        parent::__construct();
36
-        EE_Registry::instance()->load_helper('Inflector');
37
-    }
33
+	public function __construct()
34
+	{
35
+		parent::__construct();
36
+		EE_Registry::instance()->load_helper('Inflector');
37
+	}
38 38
 
39 39
 
40
-    /**
41
-     * Handles requests to get all (or a filtered subset) of entities for a particular model
42
-     *
43
-     * @param WP_REST_Request $request
44
-     * @param string          $version
45
-     * @param string          $model_name
46
-     * @return WP_REST_Response|\WP_Error
47
-     */
48
-    public static function handleRequestInsert(WP_REST_Request $request, $version, $model_name)
49
-    {
50
-        $controller = new Write();
51
-        try {
52
-            $controller->setRequestedVersion($version);
53
-            return $controller->sendResponse(
54
-                $controller->insert(
55
-                    $controller->getModelVersionInfo()->loadModel($model_name),
56
-                    $request
57
-                )
58
-            );
59
-        } catch (\Exception $e) {
60
-            return $controller->sendResponse($e);
61
-        }
62
-    }
40
+	/**
41
+	 * Handles requests to get all (or a filtered subset) of entities for a particular model
42
+	 *
43
+	 * @param WP_REST_Request $request
44
+	 * @param string          $version
45
+	 * @param string          $model_name
46
+	 * @return WP_REST_Response|\WP_Error
47
+	 */
48
+	public static function handleRequestInsert(WP_REST_Request $request, $version, $model_name)
49
+	{
50
+		$controller = new Write();
51
+		try {
52
+			$controller->setRequestedVersion($version);
53
+			return $controller->sendResponse(
54
+				$controller->insert(
55
+					$controller->getModelVersionInfo()->loadModel($model_name),
56
+					$request
57
+				)
58
+			);
59
+		} catch (\Exception $e) {
60
+			return $controller->sendResponse($e);
61
+		}
62
+	}
63 63
 
64 64
 
65
-    /**
66
-     * Handles a request from \WP_REST_Server to update an EE model
67
-     *
68
-     * @param WP_REST_Request $request
69
-     * @param string          $version
70
-     * @param string          $model_name
71
-     * @return WP_REST_Response|\WP_Error
72
-     */
73
-    public static function handleRequestUpdate(WP_REST_Request $request, $version, $model_name)
74
-    {
75
-        $controller = new Write();
76
-        try {
77
-            $controller->setRequestedVersion($version);
78
-            return $controller->sendResponse(
79
-                $controller->update(
80
-                    $controller->getModelVersionInfo()->loadModel($model_name),
81
-                    $request
82
-                )
83
-            );
84
-        } catch (\Exception $e) {
85
-            return $controller->sendResponse($e);
86
-        }
87
-    }
65
+	/**
66
+	 * Handles a request from \WP_REST_Server to update an EE model
67
+	 *
68
+	 * @param WP_REST_Request $request
69
+	 * @param string          $version
70
+	 * @param string          $model_name
71
+	 * @return WP_REST_Response|\WP_Error
72
+	 */
73
+	public static function handleRequestUpdate(WP_REST_Request $request, $version, $model_name)
74
+	{
75
+		$controller = new Write();
76
+		try {
77
+			$controller->setRequestedVersion($version);
78
+			return $controller->sendResponse(
79
+				$controller->update(
80
+					$controller->getModelVersionInfo()->loadModel($model_name),
81
+					$request
82
+				)
83
+			);
84
+		} catch (\Exception $e) {
85
+			return $controller->sendResponse($e);
86
+		}
87
+	}
88 88
 
89 89
 
90
-    /**
91
-     * Deletes a single model object and returns it. Unless
92
-     *
93
-     * @param WP_REST_Request $request
94
-     * @param string          $version
95
-     * @param string          $model_name
96
-     * @return WP_REST_Response|\WP_Error
97
-     */
98
-    public static function handleRequestDelete(WP_REST_Request $request, $version, $model_name)
99
-    {
100
-        $controller = new Write();
101
-        try {
102
-            $controller->setRequestedVersion($version);
103
-            return $controller->sendResponse(
104
-                $controller->delete(
105
-                    $controller->getModelVersionInfo()->loadModel($model_name),
106
-                    $request
107
-                )
108
-            );
109
-        } catch (\Exception $e) {
110
-            return $controller->sendResponse($e);
111
-        }
112
-    }
90
+	/**
91
+	 * Deletes a single model object and returns it. Unless
92
+	 *
93
+	 * @param WP_REST_Request $request
94
+	 * @param string          $version
95
+	 * @param string          $model_name
96
+	 * @return WP_REST_Response|\WP_Error
97
+	 */
98
+	public static function handleRequestDelete(WP_REST_Request $request, $version, $model_name)
99
+	{
100
+		$controller = new Write();
101
+		try {
102
+			$controller->setRequestedVersion($version);
103
+			return $controller->sendResponse(
104
+				$controller->delete(
105
+					$controller->getModelVersionInfo()->loadModel($model_name),
106
+					$request
107
+				)
108
+			);
109
+		} catch (\Exception $e) {
110
+			return $controller->sendResponse($e);
111
+		}
112
+	}
113 113
 
114 114
 
115
-    /**
116
-     * Inserts a new model object according to the $request
117
-     *
118
-     * @param EEM_Base        $model
119
-     * @param WP_REST_Request $request
120
-     * @return array
121
-     * @throws EE_Error
122
-     * @throws RestException
123
-     */
124
-    public function insert(EEM_Base $model, WP_REST_Request $request)
125
-    {
126
-        Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'create');
127
-        $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap();
128
-        if (! current_user_can($default_cap_to_check_for)) {
129
-            throw new RestException(
130
-                'rest_cannot_create_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
131
-                sprintf(
132
-                    esc_html__(
133
-                    // @codingStandardsIgnoreStart
134
-                        'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to insert data into Event Espresso.',
135
-                        // @codingStandardsIgnoreEnd
136
-                        'event_espresso'
137
-                    ),
138
-                    $default_cap_to_check_for
139
-                ),
140
-                array('status' => 403)
141
-            );
142
-        }
143
-        $submitted_json_data = array_merge((array) $request->get_body_params(), (array) $request->get_json_params());
144
-        $model_data = ModelDataTranslator::prepareConditionsQueryParamsForModels(
145
-            $submitted_json_data,
146
-            $model,
147
-            $this->getModelVersionInfo()->requestedVersion(),
148
-            true
149
-        );
150
-        $model_obj = EE_Registry::instance()->load_class(
151
-            $model->get_this_model_name(),
152
-            array($model_data, $model->get_timezone()),
153
-            false,
154
-            false
155
-        );
156
-        $model_obj->save();
157
-        $new_id = $model_obj->ID();
158
-        if (! $new_id) {
159
-            throw new RestException(
160
-                'rest_insertion_failed',
161
-                sprintf(__('Could not insert new %1$s', 'event_espresso'), $model->get_this_model_name())
162
-            );
163
-        }
164
-        return $this->returnModelObjAsJsonResponse($model_obj, $request);
165
-    }
115
+	/**
116
+	 * Inserts a new model object according to the $request
117
+	 *
118
+	 * @param EEM_Base        $model
119
+	 * @param WP_REST_Request $request
120
+	 * @return array
121
+	 * @throws EE_Error
122
+	 * @throws RestException
123
+	 */
124
+	public function insert(EEM_Base $model, WP_REST_Request $request)
125
+	{
126
+		Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'create');
127
+		$default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap();
128
+		if (! current_user_can($default_cap_to_check_for)) {
129
+			throw new RestException(
130
+				'rest_cannot_create_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
131
+				sprintf(
132
+					esc_html__(
133
+					// @codingStandardsIgnoreStart
134
+						'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to insert data into Event Espresso.',
135
+						// @codingStandardsIgnoreEnd
136
+						'event_espresso'
137
+					),
138
+					$default_cap_to_check_for
139
+				),
140
+				array('status' => 403)
141
+			);
142
+		}
143
+		$submitted_json_data = array_merge((array) $request->get_body_params(), (array) $request->get_json_params());
144
+		$model_data = ModelDataTranslator::prepareConditionsQueryParamsForModels(
145
+			$submitted_json_data,
146
+			$model,
147
+			$this->getModelVersionInfo()->requestedVersion(),
148
+			true
149
+		);
150
+		$model_obj = EE_Registry::instance()->load_class(
151
+			$model->get_this_model_name(),
152
+			array($model_data, $model->get_timezone()),
153
+			false,
154
+			false
155
+		);
156
+		$model_obj->save();
157
+		$new_id = $model_obj->ID();
158
+		if (! $new_id) {
159
+			throw new RestException(
160
+				'rest_insertion_failed',
161
+				sprintf(__('Could not insert new %1$s', 'event_espresso'), $model->get_this_model_name())
162
+			);
163
+		}
164
+		return $this->returnModelObjAsJsonResponse($model_obj, $request);
165
+	}
166 166
 
167 167
 
168
-    /**
169
-     * Updates an existing model object according to the $request
170
-     *
171
-     * @param EEM_Base        $model
172
-     * @param WP_REST_Request $request
173
-     * @return array
174
-     * @throws EE_Error
175
-     */
176
-    public function update(EEM_Base $model, WP_REST_Request $request)
177
-    {
178
-        Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'edit');
179
-        $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap();
180
-        if (! current_user_can($default_cap_to_check_for)) {
181
-            throw new RestException(
182
-                'rest_cannot_edit_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
183
-                sprintf(
184
-                    esc_html__(
185
-                    // @codingStandardsIgnoreStart
186
-                        'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to update data into Event Espresso.',
187
-                        // @codingStandardsIgnoreEnd
188
-                        'event_espresso'
189
-                    ),
190
-                    $default_cap_to_check_for
191
-                ),
192
-                array('status' => 403)
193
-            );
194
-        }
195
-        $obj_id = $request->get_param('id');
196
-        if (! $obj_id) {
197
-            throw new RestException(
198
-                'rest_edit_failed',
199
-                sprintf(__('Could not edit %1$s', 'event_espresso'), $model->get_this_model_name())
200
-            );
201
-        }
202
-        $model_data = ModelDataTranslator::prepareConditionsQueryParamsForModels(
203
-            $this->getBodyParams($request),
204
-            $model,
205
-            $this->getModelVersionInfo()->requestedVersion(),
206
-            true
207
-        );
208
-        $model_obj = $model->get_one_by_ID($obj_id);
209
-        if (! $model_obj instanceof EE_Base_Class) {
210
-            $lowercase_model_name = strtolower($model->get_this_model_name());
211
-            throw new RestException(
212
-                sprintf('rest_%s_invalid_id', $lowercase_model_name),
213
-                sprintf(__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name),
214
-                array('status' => 404)
215
-            );
216
-        }
217
-        $model_obj->save($model_data);
218
-        return $this->returnModelObjAsJsonResponse($model_obj, $request);
219
-    }
168
+	/**
169
+	 * Updates an existing model object according to the $request
170
+	 *
171
+	 * @param EEM_Base        $model
172
+	 * @param WP_REST_Request $request
173
+	 * @return array
174
+	 * @throws EE_Error
175
+	 */
176
+	public function update(EEM_Base $model, WP_REST_Request $request)
177
+	{
178
+		Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'edit');
179
+		$default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap();
180
+		if (! current_user_can($default_cap_to_check_for)) {
181
+			throw new RestException(
182
+				'rest_cannot_edit_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
183
+				sprintf(
184
+					esc_html__(
185
+					// @codingStandardsIgnoreStart
186
+						'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to update data into Event Espresso.',
187
+						// @codingStandardsIgnoreEnd
188
+						'event_espresso'
189
+					),
190
+					$default_cap_to_check_for
191
+				),
192
+				array('status' => 403)
193
+			);
194
+		}
195
+		$obj_id = $request->get_param('id');
196
+		if (! $obj_id) {
197
+			throw new RestException(
198
+				'rest_edit_failed',
199
+				sprintf(__('Could not edit %1$s', 'event_espresso'), $model->get_this_model_name())
200
+			);
201
+		}
202
+		$model_data = ModelDataTranslator::prepareConditionsQueryParamsForModels(
203
+			$this->getBodyParams($request),
204
+			$model,
205
+			$this->getModelVersionInfo()->requestedVersion(),
206
+			true
207
+		);
208
+		$model_obj = $model->get_one_by_ID($obj_id);
209
+		if (! $model_obj instanceof EE_Base_Class) {
210
+			$lowercase_model_name = strtolower($model->get_this_model_name());
211
+			throw new RestException(
212
+				sprintf('rest_%s_invalid_id', $lowercase_model_name),
213
+				sprintf(__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name),
214
+				array('status' => 404)
215
+			);
216
+		}
217
+		$model_obj->save($model_data);
218
+		return $this->returnModelObjAsJsonResponse($model_obj, $request);
219
+	}
220 220
 
221 221
 
222
-    /**
223
-     * Updates an existing model object according to the $request
224
-     *
225
-     * @param EEM_Base        $model
226
-     * @param WP_REST_Request $request
227
-     * @return array of either the soft-deleted item, or
228
-     * @throws EE_Error
229
-     */
230
-    public function delete(EEM_Base $model, WP_REST_Request $request)
231
-    {
232
-        Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_delete, 'delete');
233
-        $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap();
234
-        if (! current_user_can($default_cap_to_check_for)) {
235
-            throw new RestException(
236
-                'rest_cannot_delete_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
237
-                sprintf(
238
-                    esc_html__(
239
-                    // @codingStandardsIgnoreStart
240
-                        'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to delete data into Event Espresso.',
241
-                        // @codingStandardsIgnoreEnd
242
-                        'event_espresso'
243
-                    ),
244
-                    $default_cap_to_check_for
245
-                ),
246
-                array('status' => 403)
247
-            );
248
-        }
249
-        $obj_id = $request->get_param('id');
250
-        // this is where we would apply more fine-grained caps
251
-        $model_obj = $model->get_one_by_ID($obj_id);
252
-        if (! $model_obj instanceof EE_Base_Class) {
253
-            $lowercase_model_name = strtolower($model->get_this_model_name());
254
-            throw new RestException(
255
-                sprintf('rest_%s_invalid_id', $lowercase_model_name),
256
-                sprintf(__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name),
257
-                array('status' => 404)
258
-            );
259
-        }
260
-        $requested_permanent_delete = filter_var($request->get_param('force'), FILTER_VALIDATE_BOOLEAN);
261
-        $requested_allow_blocking = filter_var($request->get_param('allow_blocking'), FILTER_VALIDATE_BOOLEAN);
262
-        if ($requested_permanent_delete) {
263
-            $previous = $this->returnModelObjAsJsonResponse($model_obj, $request);
264
-            $deleted = (bool) $model->delete_permanently_by_ID($obj_id, $requested_allow_blocking);
265
-            return array(
266
-                'deleted'  => $deleted,
267
-                'previous' => $previous,
268
-            );
269
-        } else {
270
-            if ($model instanceof EEM_Soft_Delete_Base) {
271
-                $model->delete_by_ID($obj_id, $requested_allow_blocking);
272
-                return $this->returnModelObjAsJsonResponse($model_obj, $request);
273
-            } else {
274
-                throw new RestException(
275
-                    'rest_trash_not_supported',
276
-                    501,
277
-                    sprintf(
278
-                        esc_html__('%1$s do not support trashing. Set force=1 to delete.', 'event_espresso'),
279
-                        EEH_Inflector::pluralize($model->get_this_model_name())
280
-                    )
281
-                );
282
-            }
283
-        }
284
-    }
222
+	/**
223
+	 * Updates an existing model object according to the $request
224
+	 *
225
+	 * @param EEM_Base        $model
226
+	 * @param WP_REST_Request $request
227
+	 * @return array of either the soft-deleted item, or
228
+	 * @throws EE_Error
229
+	 */
230
+	public function delete(EEM_Base $model, WP_REST_Request $request)
231
+	{
232
+		Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_delete, 'delete');
233
+		$default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap();
234
+		if (! current_user_can($default_cap_to_check_for)) {
235
+			throw new RestException(
236
+				'rest_cannot_delete_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
237
+				sprintf(
238
+					esc_html__(
239
+					// @codingStandardsIgnoreStart
240
+						'For now, only those with the admin capability to "%1$s" are allowed to use the REST API to delete data into Event Espresso.',
241
+						// @codingStandardsIgnoreEnd
242
+						'event_espresso'
243
+					),
244
+					$default_cap_to_check_for
245
+				),
246
+				array('status' => 403)
247
+			);
248
+		}
249
+		$obj_id = $request->get_param('id');
250
+		// this is where we would apply more fine-grained caps
251
+		$model_obj = $model->get_one_by_ID($obj_id);
252
+		if (! $model_obj instanceof EE_Base_Class) {
253
+			$lowercase_model_name = strtolower($model->get_this_model_name());
254
+			throw new RestException(
255
+				sprintf('rest_%s_invalid_id', $lowercase_model_name),
256
+				sprintf(__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name),
257
+				array('status' => 404)
258
+			);
259
+		}
260
+		$requested_permanent_delete = filter_var($request->get_param('force'), FILTER_VALIDATE_BOOLEAN);
261
+		$requested_allow_blocking = filter_var($request->get_param('allow_blocking'), FILTER_VALIDATE_BOOLEAN);
262
+		if ($requested_permanent_delete) {
263
+			$previous = $this->returnModelObjAsJsonResponse($model_obj, $request);
264
+			$deleted = (bool) $model->delete_permanently_by_ID($obj_id, $requested_allow_blocking);
265
+			return array(
266
+				'deleted'  => $deleted,
267
+				'previous' => $previous,
268
+			);
269
+		} else {
270
+			if ($model instanceof EEM_Soft_Delete_Base) {
271
+				$model->delete_by_ID($obj_id, $requested_allow_blocking);
272
+				return $this->returnModelObjAsJsonResponse($model_obj, $request);
273
+			} else {
274
+				throw new RestException(
275
+					'rest_trash_not_supported',
276
+					501,
277
+					sprintf(
278
+						esc_html__('%1$s do not support trashing. Set force=1 to delete.', 'event_espresso'),
279
+						EEH_Inflector::pluralize($model->get_this_model_name())
280
+					)
281
+				);
282
+			}
283
+		}
284
+	}
285 285
 
286 286
 
287
-    /**
288
-     * Returns an array ready to be converted into a JSON response, based solely on the model object
289
-     *
290
-     * @param EE_Base_Class   $model_obj
291
-     * @param WP_REST_Request $request
292
-     * @return array ready for a response
293
-     */
294
-    protected function returnModelObjAsJsonResponse(EE_Base_Class $model_obj, WP_REST_Request $request)
295
-    {
296
-        $model = $model_obj->get_model();
297
-        // create an array exactly like the wpdb results row,
298
-        // so we can pass it to controllers/model/Read::create_entity_from_wpdb_result()
299
-        $simulated_db_row = array();
300
-        foreach ($model->field_settings(true) as $field_name => $field_obj) {
301
-            // we need to reconstruct the normal wpdb results, including the db-only fields
302
-            // like a secondary table's primary key. The models expect those (but don't care what value they have)
303
-            if ($field_obj instanceof EE_DB_Only_Field_Base) {
304
-                $raw_value = true;
305
-            } elseif ($field_obj instanceof EE_Datetime_Field) {
306
-                $raw_value = $model_obj->get_DateTime_object($field_name);
307
-            } else {
308
-                $raw_value = $model_obj->get_raw($field_name);
309
-            }
310
-            $simulated_db_row[ $field_obj->get_qualified_column() ] = $field_obj->prepare_for_use_in_db($raw_value);
311
-        }
312
-        $read_controller = new Read();
313
-        $read_controller->setRequestedVersion($this->getRequestedVersion());
314
-        // the simulates request really doesn't need any info downstream
315
-        $simulated_request = new WP_REST_Request('GET');
316
-        return $read_controller->createEntityFromWpdbResult(
317
-            $model_obj->get_model(),
318
-            $simulated_db_row,
319
-            $simulated_request
320
-        );
321
-    }
287
+	/**
288
+	 * Returns an array ready to be converted into a JSON response, based solely on the model object
289
+	 *
290
+	 * @param EE_Base_Class   $model_obj
291
+	 * @param WP_REST_Request $request
292
+	 * @return array ready for a response
293
+	 */
294
+	protected function returnModelObjAsJsonResponse(EE_Base_Class $model_obj, WP_REST_Request $request)
295
+	{
296
+		$model = $model_obj->get_model();
297
+		// create an array exactly like the wpdb results row,
298
+		// so we can pass it to controllers/model/Read::create_entity_from_wpdb_result()
299
+		$simulated_db_row = array();
300
+		foreach ($model->field_settings(true) as $field_name => $field_obj) {
301
+			// we need to reconstruct the normal wpdb results, including the db-only fields
302
+			// like a secondary table's primary key. The models expect those (but don't care what value they have)
303
+			if ($field_obj instanceof EE_DB_Only_Field_Base) {
304
+				$raw_value = true;
305
+			} elseif ($field_obj instanceof EE_Datetime_Field) {
306
+				$raw_value = $model_obj->get_DateTime_object($field_name);
307
+			} else {
308
+				$raw_value = $model_obj->get_raw($field_name);
309
+			}
310
+			$simulated_db_row[ $field_obj->get_qualified_column() ] = $field_obj->prepare_for_use_in_db($raw_value);
311
+		}
312
+		$read_controller = new Read();
313
+		$read_controller->setRequestedVersion($this->getRequestedVersion());
314
+		// the simulates request really doesn't need any info downstream
315
+		$simulated_request = new WP_REST_Request('GET');
316
+		return $read_controller->createEntityFromWpdbResult(
317
+			$model_obj->get_model(),
318
+			$simulated_db_row,
319
+			$simulated_request
320
+		);
321
+	}
322 322
 
323 323
 
324
-    /**
325
-     * Gets the item affected by this request
326
-     *
327
-     * @param EEM_Base        $model
328
-     * @param WP_REST_Request $request
329
-     * @param  int|string     $obj_id
330
-     * @return \WP_Error|array
331
-     */
332
-    protected function getOneBasedOnRequest(EEM_Base $model, WP_REST_Request $request, $obj_id)
333
-    {
334
-        $requested_version = $this->getRequestedVersion($request->get_route());
335
-        $get_request = new WP_REST_Request(
336
-            'GET',
337
-            EED_Core_Rest_Api::ee_api_namespace
338
-            . $requested_version
339
-            . '/'
340
-            . EEH_Inflector::pluralize_and_lower($model->get_this_model_name())
341
-            . '/'
342
-            . $obj_id
343
-        );
344
-        $get_request->set_url_params(
345
-            array(
346
-                'id'      => $obj_id,
347
-                'include' => $request->get_param('include'),
348
-            )
349
-        );
350
-        $read_controller = new Read();
351
-        $read_controller->setRequestedVersion($this->getRequestedVersion());
352
-        return $read_controller->getEntityFromModel($model, $get_request);
353
-    }
324
+	/**
325
+	 * Gets the item affected by this request
326
+	 *
327
+	 * @param EEM_Base        $model
328
+	 * @param WP_REST_Request $request
329
+	 * @param  int|string     $obj_id
330
+	 * @return \WP_Error|array
331
+	 */
332
+	protected function getOneBasedOnRequest(EEM_Base $model, WP_REST_Request $request, $obj_id)
333
+	{
334
+		$requested_version = $this->getRequestedVersion($request->get_route());
335
+		$get_request = new WP_REST_Request(
336
+			'GET',
337
+			EED_Core_Rest_Api::ee_api_namespace
338
+			. $requested_version
339
+			. '/'
340
+			. EEH_Inflector::pluralize_and_lower($model->get_this_model_name())
341
+			. '/'
342
+			. $obj_id
343
+		);
344
+		$get_request->set_url_params(
345
+			array(
346
+				'id'      => $obj_id,
347
+				'include' => $request->get_param('include'),
348
+			)
349
+		);
350
+		$read_controller = new Read();
351
+		$read_controller->setRequestedVersion($this->getRequestedVersion());
352
+		return $read_controller->getEntityFromModel($model, $get_request);
353
+	}
354 354
 }
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -125,9 +125,9 @@  discard block
 block discarded – undo
125 125
     {
126 126
         Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'create');
127 127
         $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap();
128
-        if (! current_user_can($default_cap_to_check_for)) {
128
+        if ( ! current_user_can($default_cap_to_check_for)) {
129 129
             throw new RestException(
130
-                'rest_cannot_create_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
130
+                'rest_cannot_create_'.EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
131 131
                 sprintf(
132 132
                     esc_html__(
133 133
                     // @codingStandardsIgnoreStart
@@ -155,7 +155,7 @@  discard block
 block discarded – undo
155 155
         );
156 156
         $model_obj->save();
157 157
         $new_id = $model_obj->ID();
158
-        if (! $new_id) {
158
+        if ( ! $new_id) {
159 159
             throw new RestException(
160 160
                 'rest_insertion_failed',
161 161
                 sprintf(__('Could not insert new %1$s', 'event_espresso'), $model->get_this_model_name())
@@ -177,9 +177,9 @@  discard block
 block discarded – undo
177 177
     {
178 178
         Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_edit, 'edit');
179 179
         $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap();
180
-        if (! current_user_can($default_cap_to_check_for)) {
180
+        if ( ! current_user_can($default_cap_to_check_for)) {
181 181
             throw new RestException(
182
-                'rest_cannot_edit_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
182
+                'rest_cannot_edit_'.EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
183 183
                 sprintf(
184 184
                     esc_html__(
185 185
                     // @codingStandardsIgnoreStart
@@ -193,7 +193,7 @@  discard block
 block discarded – undo
193 193
             );
194 194
         }
195 195
         $obj_id = $request->get_param('id');
196
-        if (! $obj_id) {
196
+        if ( ! $obj_id) {
197 197
             throw new RestException(
198 198
                 'rest_edit_failed',
199 199
                 sprintf(__('Could not edit %1$s', 'event_espresso'), $model->get_this_model_name())
@@ -206,7 +206,7 @@  discard block
 block discarded – undo
206 206
             true
207 207
         );
208 208
         $model_obj = $model->get_one_by_ID($obj_id);
209
-        if (! $model_obj instanceof EE_Base_Class) {
209
+        if ( ! $model_obj instanceof EE_Base_Class) {
210 210
             $lowercase_model_name = strtolower($model->get_this_model_name());
211 211
             throw new RestException(
212 212
                 sprintf('rest_%s_invalid_id', $lowercase_model_name),
@@ -231,9 +231,9 @@  discard block
 block discarded – undo
231 231
     {
232 232
         Capabilities::verifyAtLeastPartialAccessTo($model, EEM_Base::caps_delete, 'delete');
233 233
         $default_cap_to_check_for = EE_Restriction_Generator_Base::get_default_restrictions_cap();
234
-        if (! current_user_can($default_cap_to_check_for)) {
234
+        if ( ! current_user_can($default_cap_to_check_for)) {
235 235
             throw new RestException(
236
-                'rest_cannot_delete_' . EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
236
+                'rest_cannot_delete_'.EEH_Inflector::pluralize_and_lower(($model->get_this_model_name())),
237 237
                 sprintf(
238 238
                     esc_html__(
239 239
                     // @codingStandardsIgnoreStart
@@ -249,7 +249,7 @@  discard block
 block discarded – undo
249 249
         $obj_id = $request->get_param('id');
250 250
         // this is where we would apply more fine-grained caps
251 251
         $model_obj = $model->get_one_by_ID($obj_id);
252
-        if (! $model_obj instanceof EE_Base_Class) {
252
+        if ( ! $model_obj instanceof EE_Base_Class) {
253 253
             $lowercase_model_name = strtolower($model->get_this_model_name());
254 254
             throw new RestException(
255 255
                 sprintf('rest_%s_invalid_id', $lowercase_model_name),
@@ -307,7 +307,7 @@  discard block
 block discarded – undo
307 307
             } else {
308 308
                 $raw_value = $model_obj->get_raw($field_name);
309 309
             }
310
-            $simulated_db_row[ $field_obj->get_qualified_column() ] = $field_obj->prepare_for_use_in_db($raw_value);
310
+            $simulated_db_row[$field_obj->get_qualified_column()] = $field_obj->prepare_for_use_in_db($raw_value);
311 311
         }
312 312
         $read_controller = new Read();
313 313
         $read_controller->setRequestedVersion($this->getRequestedVersion());
Please login to merge, or discard this patch.
core/libraries/rest_api/controllers/model/Meta.php 2 patches
Indentation   +109 added lines, -109 removed lines patch added patch discarded remove patch
@@ -23,122 +23,122 @@
 block discarded – undo
23 23
 {
24 24
 
25 25
 
26
-    /**
27
-     * @param \WP_REST_Request $request
28
-     * @param string           $version
29
-     * @return array|\WP_REST_Response
30
-     */
31
-    public static function handleRequestModelsMeta(\WP_REST_Request $request, $version)
32
-    {
33
-        $controller = new Meta();
34
-        try {
35
-            $controller->setRequestedVersion($version);
36
-            return $controller->sendResponse($controller->getModelsMetadataEntity());
37
-        } catch (Exception $e) {
38
-            return $controller->sendResponse($e);
39
-        }
40
-    }
26
+	/**
27
+	 * @param \WP_REST_Request $request
28
+	 * @param string           $version
29
+	 * @return array|\WP_REST_Response
30
+	 */
31
+	public static function handleRequestModelsMeta(\WP_REST_Request $request, $version)
32
+	{
33
+		$controller = new Meta();
34
+		try {
35
+			$controller->setRequestedVersion($version);
36
+			return $controller->sendResponse($controller->getModelsMetadataEntity());
37
+		} catch (Exception $e) {
38
+			return $controller->sendResponse($e);
39
+		}
40
+	}
41 41
 
42 42
 
43
-    /*
43
+	/*
44 44
      * Gets the model metadata resource entity
45 45
      * @return array for JSON response, describing all the models available in teh requested version
46 46
      */
47
-    protected function getModelsMetadataEntity()
48
-    {
49
-        $response = array();
50
-        foreach ($this->getModelVersionInfo()->modelsForRequestedVersion() as $model_name => $model_classname) {
51
-            $model = $this->getModelVersionInfo()->loadModel($model_name);
52
-            $fields_json = array();
53
-            foreach ($this->getModelVersionInfo()->fieldsOnModelInThisVersion($model) as $field_name => $field_obj) {
54
-                if ($this->getModelVersionInfo()->fieldIsIgnored($field_obj)) {
55
-                    continue;
56
-                }
57
-                if ($field_obj instanceof EE_Boolean_Field) {
58
-                    $datatype = 'Boolean';
59
-                } elseif ($field_obj->get_wpdb_data_type() == '%d') {
60
-                    $datatype = 'Number';
61
-                } elseif ($field_name instanceof EE_Serialized_Text_Field) {
62
-                    $datatype = 'Object';
63
-                } else {
64
-                    $datatype = 'String';
65
-                }
66
-                $default_value = ModelDataTranslator::prepareFieldValueForJson(
67
-                    $field_obj,
68
-                    $field_obj->get_default_value(),
69
-                    $this->getModelVersionInfo()->requestedVersion()
70
-                );
71
-                $field_json = array(
72
-                    'name'                => $field_name,
73
-                    'nicename'            => wp_specialchars_decode($field_obj->get_nicename(), ENT_QUOTES),
74
-                    'has_rendered_format' => $this->getModelVersionInfo()->fieldHasRenderedFormat($field_obj),
75
-                    'has_pretty_format'   => $this->getModelVersionInfo()->fieldHasPrettyFormat($field_obj),
76
-                    'type'                => str_replace('EE_', '', get_class($field_obj)),
77
-                    'datatype'            => $datatype,
78
-                    'nullable'            => $field_obj->is_nullable(),
79
-                    'default'             => $default_value,
80
-                    'table_alias'         => $field_obj->get_table_alias(),
81
-                    'table_column'        => $field_obj->get_table_column(),
82
-                );
83
-                $fields_json[ $field_json['name'] ] = $field_json;
84
-            }
85
-            $fields_json = array_merge(
86
-                $fields_json,
87
-                $this->getModelVersionInfo()->extraResourcePropertiesForModel($model)
88
-            );
89
-            $response[ $model_name ]['fields'] = apply_filters(
90
-                'FHEE__Meta__handle_request_models_meta__fields',
91
-                $fields_json,
92
-                $model
93
-            );
94
-            $relations_json = array();
95
-            foreach ($model->relation_settings() as $relation_name => $relation_obj) {
96
-                $relation_json = array(
97
-                    'name'   => $relation_name,
98
-                    'type'   => str_replace('EE_', '', get_class($relation_obj)),
99
-                    'single' => $relation_obj instanceof \EE_Belongs_To_Relation ? true : false,
100
-                );
101
-                $relations_json[ $relation_name ] = $relation_json;
102
-            }
103
-            $response[ $model_name ]['relations'] = apply_filters(
104
-                'FHEE__Meta__handle_request_models_meta__relations',
105
-                $relations_json,
106
-                $model
107
-            );
108
-        }
109
-        return $response;
110
-    }
47
+	protected function getModelsMetadataEntity()
48
+	{
49
+		$response = array();
50
+		foreach ($this->getModelVersionInfo()->modelsForRequestedVersion() as $model_name => $model_classname) {
51
+			$model = $this->getModelVersionInfo()->loadModel($model_name);
52
+			$fields_json = array();
53
+			foreach ($this->getModelVersionInfo()->fieldsOnModelInThisVersion($model) as $field_name => $field_obj) {
54
+				if ($this->getModelVersionInfo()->fieldIsIgnored($field_obj)) {
55
+					continue;
56
+				}
57
+				if ($field_obj instanceof EE_Boolean_Field) {
58
+					$datatype = 'Boolean';
59
+				} elseif ($field_obj->get_wpdb_data_type() == '%d') {
60
+					$datatype = 'Number';
61
+				} elseif ($field_name instanceof EE_Serialized_Text_Field) {
62
+					$datatype = 'Object';
63
+				} else {
64
+					$datatype = 'String';
65
+				}
66
+				$default_value = ModelDataTranslator::prepareFieldValueForJson(
67
+					$field_obj,
68
+					$field_obj->get_default_value(),
69
+					$this->getModelVersionInfo()->requestedVersion()
70
+				);
71
+				$field_json = array(
72
+					'name'                => $field_name,
73
+					'nicename'            => wp_specialchars_decode($field_obj->get_nicename(), ENT_QUOTES),
74
+					'has_rendered_format' => $this->getModelVersionInfo()->fieldHasRenderedFormat($field_obj),
75
+					'has_pretty_format'   => $this->getModelVersionInfo()->fieldHasPrettyFormat($field_obj),
76
+					'type'                => str_replace('EE_', '', get_class($field_obj)),
77
+					'datatype'            => $datatype,
78
+					'nullable'            => $field_obj->is_nullable(),
79
+					'default'             => $default_value,
80
+					'table_alias'         => $field_obj->get_table_alias(),
81
+					'table_column'        => $field_obj->get_table_column(),
82
+				);
83
+				$fields_json[ $field_json['name'] ] = $field_json;
84
+			}
85
+			$fields_json = array_merge(
86
+				$fields_json,
87
+				$this->getModelVersionInfo()->extraResourcePropertiesForModel($model)
88
+			);
89
+			$response[ $model_name ]['fields'] = apply_filters(
90
+				'FHEE__Meta__handle_request_models_meta__fields',
91
+				$fields_json,
92
+				$model
93
+			);
94
+			$relations_json = array();
95
+			foreach ($model->relation_settings() as $relation_name => $relation_obj) {
96
+				$relation_json = array(
97
+					'name'   => $relation_name,
98
+					'type'   => str_replace('EE_', '', get_class($relation_obj)),
99
+					'single' => $relation_obj instanceof \EE_Belongs_To_Relation ? true : false,
100
+				);
101
+				$relations_json[ $relation_name ] = $relation_json;
102
+			}
103
+			$response[ $model_name ]['relations'] = apply_filters(
104
+				'FHEE__Meta__handle_request_models_meta__relations',
105
+				$relations_json,
106
+				$model
107
+			);
108
+		}
109
+		return $response;
110
+	}
111 111
 
112 112
 
113
-    /**
114
-     * Adds EE metadata to the index
115
-     *
116
-     * @param \WP_REST_Response $rest_response_obj
117
-     * @return \WP_REST_Response
118
-     */
119
-    public static function filterEeMetadataIntoIndex(\WP_REST_Response $rest_response_obj)
120
-    {
121
-        $response_data = $rest_response_obj->get_data();
122
-        $addons = array();
123
-        foreach (EE_Registry::instance()->addons as $addon) {
124
-            $addon_json = array(
125
-                'name'    => $addon->name(),
126
-                'version' => $addon->version(),
127
-            );
128
-            $addons[ $addon_json['name'] ] = $addon_json;
129
-        }
130
-        $response_data['ee'] = array(
131
-            'version'              => EEM_System_Status::instance()->get_ee_version(),
132
-            // @codingStandardsIgnoreStart
133
-            'documentation_url'    => 'https://github.com/eventespresso/event-espresso-core/tree/master/docs/C--REST-API',
134
-            // @codingStandardsIgnoreEnd
135
-            'addons'               => $addons,
136
-            'maintenance_mode'     => EE_Maintenance_Mode::instance()->real_level(),
137
-            'served_core_versions' => array_keys(EED_Core_Rest_Api::versions_served()),
138
-        );
139
-        $rest_response_obj->set_data($response_data);
140
-        return $rest_response_obj;
141
-    }
113
+	/**
114
+	 * Adds EE metadata to the index
115
+	 *
116
+	 * @param \WP_REST_Response $rest_response_obj
117
+	 * @return \WP_REST_Response
118
+	 */
119
+	public static function filterEeMetadataIntoIndex(\WP_REST_Response $rest_response_obj)
120
+	{
121
+		$response_data = $rest_response_obj->get_data();
122
+		$addons = array();
123
+		foreach (EE_Registry::instance()->addons as $addon) {
124
+			$addon_json = array(
125
+				'name'    => $addon->name(),
126
+				'version' => $addon->version(),
127
+			);
128
+			$addons[ $addon_json['name'] ] = $addon_json;
129
+		}
130
+		$response_data['ee'] = array(
131
+			'version'              => EEM_System_Status::instance()->get_ee_version(),
132
+			// @codingStandardsIgnoreStart
133
+			'documentation_url'    => 'https://github.com/eventespresso/event-espresso-core/tree/master/docs/C--REST-API',
134
+			// @codingStandardsIgnoreEnd
135
+			'addons'               => $addons,
136
+			'maintenance_mode'     => EE_Maintenance_Mode::instance()->real_level(),
137
+			'served_core_versions' => array_keys(EED_Core_Rest_Api::versions_served()),
138
+		);
139
+		$rest_response_obj->set_data($response_data);
140
+		return $rest_response_obj;
141
+	}
142 142
 }
143 143
 
144 144
 
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -80,13 +80,13 @@  discard block
 block discarded – undo
80 80
                     'table_alias'         => $field_obj->get_table_alias(),
81 81
                     'table_column'        => $field_obj->get_table_column(),
82 82
                 );
83
-                $fields_json[ $field_json['name'] ] = $field_json;
83
+                $fields_json[$field_json['name']] = $field_json;
84 84
             }
85 85
             $fields_json = array_merge(
86 86
                 $fields_json,
87 87
                 $this->getModelVersionInfo()->extraResourcePropertiesForModel($model)
88 88
             );
89
-            $response[ $model_name ]['fields'] = apply_filters(
89
+            $response[$model_name]['fields'] = apply_filters(
90 90
                 'FHEE__Meta__handle_request_models_meta__fields',
91 91
                 $fields_json,
92 92
                 $model
@@ -98,9 +98,9 @@  discard block
 block discarded – undo
98 98
                     'type'   => str_replace('EE_', '', get_class($relation_obj)),
99 99
                     'single' => $relation_obj instanceof \EE_Belongs_To_Relation ? true : false,
100 100
                 );
101
-                $relations_json[ $relation_name ] = $relation_json;
101
+                $relations_json[$relation_name] = $relation_json;
102 102
             }
103
-            $response[ $model_name ]['relations'] = apply_filters(
103
+            $response[$model_name]['relations'] = apply_filters(
104 104
                 'FHEE__Meta__handle_request_models_meta__relations',
105 105
                 $relations_json,
106 106
                 $model
@@ -125,7 +125,7 @@  discard block
 block discarded – undo
125 125
                 'name'    => $addon->name(),
126 126
                 'version' => $addon->version(),
127 127
             );
128
-            $addons[ $addon_json['name'] ] = $addon_json;
128
+            $addons[$addon_json['name']] = $addon_json;
129 129
         }
130 130
         $response_data['ee'] = array(
131 131
             'version'              => EEM_System_Status::instance()->get_ee_version(),
Please login to merge, or discard this patch.
core/libraries/rest_api/CalculatedModelFields.php 2 patches
Indentation   +112 added lines, -112 removed lines patch added patch discarded remove patch
@@ -19,124 +19,124 @@
 block discarded – undo
19 19
 class CalculatedModelFields
20 20
 {
21 21
 
22
-    /**
23
-     * @var array
24
-     */
25
-    protected $mapping;
22
+	/**
23
+	 * @var array
24
+	 */
25
+	protected $mapping;
26 26
 
27 27
 
28
-    /**
29
-     * @param bool $refresh
30
-     * @return array top-level-keys are model names (eg "Event")
31
-     * next-level are the calculated field names AND method names on classes
32
-     * which perform calculations, values are the fully qualified classnames which do the calculations
33
-     * These callbacks should accept as arguments:
34
-     * the wpdb row results,
35
-     * the WP_Request object,
36
-     * the controller object
37
-     */
38
-    public function mapping($refresh = false)
39
-    {
40
-        if (! $this->mapping || $refresh) {
41
-            $this->mapping = $this->generateNewMapping();
42
-        }
43
-        return $this->mapping;
44
-    }
28
+	/**
29
+	 * @param bool $refresh
30
+	 * @return array top-level-keys are model names (eg "Event")
31
+	 * next-level are the calculated field names AND method names on classes
32
+	 * which perform calculations, values are the fully qualified classnames which do the calculations
33
+	 * These callbacks should accept as arguments:
34
+	 * the wpdb row results,
35
+	 * the WP_Request object,
36
+	 * the controller object
37
+	 */
38
+	public function mapping($refresh = false)
39
+	{
40
+		if (! $this->mapping || $refresh) {
41
+			$this->mapping = $this->generateNewMapping();
42
+		}
43
+		return $this->mapping;
44
+	}
45 45
 
46 46
 
47
-    /**
48
-     * Generates  anew mapping between model calculated fields and their callbacks
49
-     *
50
-     * @return array
51
-     */
52
-    protected function generateNewMapping()
53
-    {
54
-        $rest_api_calculations_namespace = 'EventEspresso\core\libraries\rest_api\calculations\\';
55
-        $event_calculations_class = $rest_api_calculations_namespace . 'Event';
56
-        $datetime_calculations_class = $rest_api_calculations_namespace . 'Datetime';
57
-        $registration_class = $rest_api_calculations_namespace . 'Registration';
58
-        return apply_filters(
59
-            'FHEE__EventEspresso\core\libraries\rest_api\Calculated_Model_Fields__mapping',
60
-            array(
61
-                'Event'        => array(
62
-                    'optimum_sales_at_start'          => $event_calculations_class,
63
-                    'optimum_sales_now'               => $event_calculations_class,
64
-                    'spots_taken'                     => $event_calculations_class,
65
-                    'spots_taken_pending_payment'     => $event_calculations_class,
66
-                    'spaces_remaining'                => $event_calculations_class,
67
-                    'registrations_checked_in_count'  => $event_calculations_class,
68
-                    'registrations_checked_out_count' => $event_calculations_class,
69
-                    'image_thumbnail'                 => $event_calculations_class,
70
-                    'image_medium'                    => $event_calculations_class,
71
-                    'image_medium_large'              => $event_calculations_class,
72
-                    'image_large'                     => $event_calculations_class,
73
-                    'image_post_thumbnail'            => $event_calculations_class,
74
-                    'image_full'                      => $event_calculations_class,
75
-                ),
76
-                'Datetime'     => array(
77
-                    'spaces_remaining_considering_tickets' => $datetime_calculations_class,
78
-                    'registrations_checked_in_count'       => $datetime_calculations_class,
79
-                    'registrations_checked_out_count'      => $datetime_calculations_class,
80
-                    'spots_taken_pending_payment'          => $datetime_calculations_class,
81
-                ),
82
-                'Registration' => array(
83
-                    'datetime_checkin_stati' => $registration_class,
84
-                ),
85
-            )
86
-        );
87
-    }
47
+	/**
48
+	 * Generates  anew mapping between model calculated fields and their callbacks
49
+	 *
50
+	 * @return array
51
+	 */
52
+	protected function generateNewMapping()
53
+	{
54
+		$rest_api_calculations_namespace = 'EventEspresso\core\libraries\rest_api\calculations\\';
55
+		$event_calculations_class = $rest_api_calculations_namespace . 'Event';
56
+		$datetime_calculations_class = $rest_api_calculations_namespace . 'Datetime';
57
+		$registration_class = $rest_api_calculations_namespace . 'Registration';
58
+		return apply_filters(
59
+			'FHEE__EventEspresso\core\libraries\rest_api\Calculated_Model_Fields__mapping',
60
+			array(
61
+				'Event'        => array(
62
+					'optimum_sales_at_start'          => $event_calculations_class,
63
+					'optimum_sales_now'               => $event_calculations_class,
64
+					'spots_taken'                     => $event_calculations_class,
65
+					'spots_taken_pending_payment'     => $event_calculations_class,
66
+					'spaces_remaining'                => $event_calculations_class,
67
+					'registrations_checked_in_count'  => $event_calculations_class,
68
+					'registrations_checked_out_count' => $event_calculations_class,
69
+					'image_thumbnail'                 => $event_calculations_class,
70
+					'image_medium'                    => $event_calculations_class,
71
+					'image_medium_large'              => $event_calculations_class,
72
+					'image_large'                     => $event_calculations_class,
73
+					'image_post_thumbnail'            => $event_calculations_class,
74
+					'image_full'                      => $event_calculations_class,
75
+				),
76
+				'Datetime'     => array(
77
+					'spaces_remaining_considering_tickets' => $datetime_calculations_class,
78
+					'registrations_checked_in_count'       => $datetime_calculations_class,
79
+					'registrations_checked_out_count'      => $datetime_calculations_class,
80
+					'spots_taken_pending_payment'          => $datetime_calculations_class,
81
+				),
82
+				'Registration' => array(
83
+					'datetime_checkin_stati' => $registration_class,
84
+				),
85
+			)
86
+		);
87
+	}
88 88
 
89 89
 
90
-    /**
91
-     * Gets the known calculated fields for model
92
-     *
93
-     * @param EEM_Base $model
94
-     * @return array allowable values for this field
95
-     */
96
-    public function retrieveCalculatedFieldsForModel(EEM_Base $model)
97
-    {
98
-        $mapping = $this->mapping();
99
-        if (isset($mapping[ $model->get_this_model_name() ])) {
100
-            return array_keys($mapping[ $model->get_this_model_name() ]);
101
-        } else {
102
-            return array();
103
-        }
104
-    }
90
+	/**
91
+	 * Gets the known calculated fields for model
92
+	 *
93
+	 * @param EEM_Base $model
94
+	 * @return array allowable values for this field
95
+	 */
96
+	public function retrieveCalculatedFieldsForModel(EEM_Base $model)
97
+	{
98
+		$mapping = $this->mapping();
99
+		if (isset($mapping[ $model->get_this_model_name() ])) {
100
+			return array_keys($mapping[ $model->get_this_model_name() ]);
101
+		} else {
102
+			return array();
103
+		}
104
+	}
105 105
 
106 106
 
107
-    /**
108
-     * Retrieves the value for this calculation
109
-     *
110
-     * @param EEM_Base                                                $model
111
-     * @param string                                                  $field_name
112
-     * @param array                                                   $wpdb_row
113
-     * @param \WP_REST_Request
114
-     * @param \EventEspresso\core\libraries\rest_api\controllers\Base $controller
115
-     * @return mixed|null
116
-     * @throws \EE_Error
117
-     */
118
-    public function retrieveCalculatedFieldValue(
119
-        EEM_Base $model,
120
-        $field_name,
121
-        $wpdb_row,
122
-        $rest_request,
123
-        Base $controller
124
-    ) {
125
-        $mapping = $this->mapping();
126
-        if (isset($mapping[ $model->get_this_model_name() ])
127
-            && isset($mapping[ $model->get_this_model_name() ][ $field_name ])
128
-        ) {
129
-            $classname = $mapping[ $model->get_this_model_name() ][ $field_name ];
130
-            $class_method_name = EEH_Inflector::camelize_all_but_first($field_name);
131
-            return call_user_func(array($classname, $class_method_name), $wpdb_row, $rest_request, $controller);
132
-        }
133
-        throw new RestException(
134
-            'calculated_field_does_not_exist',
135
-            sprintf(
136
-                __('There is no calculated field %1$s on resource %2$s', 'event_espresso'),
137
-                $field_name,
138
-                $model->get_this_model_name()
139
-            )
140
-        );
141
-    }
107
+	/**
108
+	 * Retrieves the value for this calculation
109
+	 *
110
+	 * @param EEM_Base                                                $model
111
+	 * @param string                                                  $field_name
112
+	 * @param array                                                   $wpdb_row
113
+	 * @param \WP_REST_Request
114
+	 * @param \EventEspresso\core\libraries\rest_api\controllers\Base $controller
115
+	 * @return mixed|null
116
+	 * @throws \EE_Error
117
+	 */
118
+	public function retrieveCalculatedFieldValue(
119
+		EEM_Base $model,
120
+		$field_name,
121
+		$wpdb_row,
122
+		$rest_request,
123
+		Base $controller
124
+	) {
125
+		$mapping = $this->mapping();
126
+		if (isset($mapping[ $model->get_this_model_name() ])
127
+			&& isset($mapping[ $model->get_this_model_name() ][ $field_name ])
128
+		) {
129
+			$classname = $mapping[ $model->get_this_model_name() ][ $field_name ];
130
+			$class_method_name = EEH_Inflector::camelize_all_but_first($field_name);
131
+			return call_user_func(array($classname, $class_method_name), $wpdb_row, $rest_request, $controller);
132
+		}
133
+		throw new RestException(
134
+			'calculated_field_does_not_exist',
135
+			sprintf(
136
+				__('There is no calculated field %1$s on resource %2$s', 'event_espresso'),
137
+				$field_name,
138
+				$model->get_this_model_name()
139
+			)
140
+		);
141
+	}
142 142
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -37,7 +37,7 @@  discard block
 block discarded – undo
37 37
      */
38 38
     public function mapping($refresh = false)
39 39
     {
40
-        if (! $this->mapping || $refresh) {
40
+        if ( ! $this->mapping || $refresh) {
41 41
             $this->mapping = $this->generateNewMapping();
42 42
         }
43 43
         return $this->mapping;
@@ -52,9 +52,9 @@  discard block
 block discarded – undo
52 52
     protected function generateNewMapping()
53 53
     {
54 54
         $rest_api_calculations_namespace = 'EventEspresso\core\libraries\rest_api\calculations\\';
55
-        $event_calculations_class = $rest_api_calculations_namespace . 'Event';
56
-        $datetime_calculations_class = $rest_api_calculations_namespace . 'Datetime';
57
-        $registration_class = $rest_api_calculations_namespace . 'Registration';
55
+        $event_calculations_class = $rest_api_calculations_namespace.'Event';
56
+        $datetime_calculations_class = $rest_api_calculations_namespace.'Datetime';
57
+        $registration_class = $rest_api_calculations_namespace.'Registration';
58 58
         return apply_filters(
59 59
             'FHEE__EventEspresso\core\libraries\rest_api\Calculated_Model_Fields__mapping',
60 60
             array(
@@ -96,8 +96,8 @@  discard block
 block discarded – undo
96 96
     public function retrieveCalculatedFieldsForModel(EEM_Base $model)
97 97
     {
98 98
         $mapping = $this->mapping();
99
-        if (isset($mapping[ $model->get_this_model_name() ])) {
100
-            return array_keys($mapping[ $model->get_this_model_name() ]);
99
+        if (isset($mapping[$model->get_this_model_name()])) {
100
+            return array_keys($mapping[$model->get_this_model_name()]);
101 101
         } else {
102 102
             return array();
103 103
         }
@@ -123,10 +123,10 @@  discard block
 block discarded – undo
123 123
         Base $controller
124 124
     ) {
125 125
         $mapping = $this->mapping();
126
-        if (isset($mapping[ $model->get_this_model_name() ])
127
-            && isset($mapping[ $model->get_this_model_name() ][ $field_name ])
126
+        if (isset($mapping[$model->get_this_model_name()])
127
+            && isset($mapping[$model->get_this_model_name()][$field_name])
128 128
         ) {
129
-            $classname = $mapping[ $model->get_this_model_name() ][ $field_name ];
129
+            $classname = $mapping[$model->get_this_model_name()][$field_name];
130 130
             $class_method_name = EEH_Inflector::camelize_all_but_first($field_name);
131 131
             return call_user_func(array($classname, $class_method_name), $wpdb_row, $rest_request, $controller);
132 132
         }
Please login to merge, or discard this patch.
core/libraries/rest_api/changes/ChangesInBase.php 2 patches
Indentation   +64 added lines, -64 removed lines patch added patch discarded remove patch
@@ -35,74 +35,74 @@
 block discarded – undo
35 35
 abstract class ChangesInBase
36 36
 {
37 37
 
38
-    /**
39
-     * The version that these changes happened
40
-     *
41
-     * @var string
42
-     */
43
-    protected $version = null;
38
+	/**
39
+	 * The version that these changes happened
40
+	 *
41
+	 * @var string
42
+	 */
43
+	protected $version = null;
44 44
 
45 45
 
46
-    /**
47
-     * Called when an EE4 REST API request is made to an earlier version than
48
-     * what is indicated in this class' name.
49
-     * Uses WordPress' add_filter and add_action to modify the EE4 REST API's response
50
-     * so that regardless of what version of EE4 core is running, API clients
51
-     * will have a consistent response
52
-     *
53
-     * @return void
54
-     */
55
-    abstract public function setHooks();
46
+	/**
47
+	 * Called when an EE4 REST API request is made to an earlier version than
48
+	 * what is indicated in this class' name.
49
+	 * Uses WordPress' add_filter and add_action to modify the EE4 REST API's response
50
+	 * so that regardless of what version of EE4 core is running, API clients
51
+	 * will have a consistent response
52
+	 *
53
+	 * @return void
54
+	 */
55
+	abstract public function setHooks();
56 56
 
57 57
 
58
-    /**
59
-     * Returns whether or not this class' name indicates its hooks should
60
-     * apply when a request comes in for $requested_version. A class can use
61
-     * other conditions when determining whether to perform their callbacks or not,
62
-     * but this will typically be enough
63
-     *
64
-     * @param string $requested_version eg "4.8.33"
65
-     * @return boolean true: this class' name indicates its filters and actions
66
-     *                                  should take effect. False: this class' name indicates it shouldn't do anything
67
-     */
68
-    public function appliesToVersion($requested_version)
69
-    {
70
-        if ($this->version() > $requested_version) {
71
-            return true;
72
-        }
73
-        return false;
74
-    }
58
+	/**
59
+	 * Returns whether or not this class' name indicates its hooks should
60
+	 * apply when a request comes in for $requested_version. A class can use
61
+	 * other conditions when determining whether to perform their callbacks or not,
62
+	 * but this will typically be enough
63
+	 *
64
+	 * @param string $requested_version eg "4.8.33"
65
+	 * @return boolean true: this class' name indicates its filters and actions
66
+	 *                                  should take effect. False: this class' name indicates it shouldn't do anything
67
+	 */
68
+	public function appliesToVersion($requested_version)
69
+	{
70
+		if ($this->version() > $requested_version) {
71
+			return true;
72
+		}
73
+		return false;
74
+	}
75 75
 
76 76
 
77
-    /**
78
-     * Gets the EE core version when this changes were made to the rest api.
79
-     * Any requests to earlier versions should have modifications made to them
80
-     * by the callbacks of this class.
81
-     *
82
-     * @return string eg "4.8.33"
83
-     * @throws EE_Error
84
-     */
85
-    public function version()
86
-    {
87
-        if ($this->version === null) {
88
-            $matches = array();
89
-            $regex = '~ChangesIn(\d)(\d\d)(\d\d)$~';
90
-            $success = preg_match(
91
-                $regex,
92
-                get_class($this),
93
-                $matches
94
-            );
95
-            if (! $success) {
96
-                throw new EE_Error(
97
-                    sprintf(
98
-                        __('The class %1$s was misnamed. It name should match the regex "%2$s"', 'event_espresso'),
99
-                        get_class($this),
100
-                        $regex
101
-                    )
102
-                );
103
-            }
104
-            $this->version = (int) $matches[1] . '.' . (int) $matches[2] . '.' . (int) $matches[3];
105
-        }
106
-        return $this->version;
107
-    }
77
+	/**
78
+	 * Gets the EE core version when this changes were made to the rest api.
79
+	 * Any requests to earlier versions should have modifications made to them
80
+	 * by the callbacks of this class.
81
+	 *
82
+	 * @return string eg "4.8.33"
83
+	 * @throws EE_Error
84
+	 */
85
+	public function version()
86
+	{
87
+		if ($this->version === null) {
88
+			$matches = array();
89
+			$regex = '~ChangesIn(\d)(\d\d)(\d\d)$~';
90
+			$success = preg_match(
91
+				$regex,
92
+				get_class($this),
93
+				$matches
94
+			);
95
+			if (! $success) {
96
+				throw new EE_Error(
97
+					sprintf(
98
+						__('The class %1$s was misnamed. It name should match the regex "%2$s"', 'event_espresso'),
99
+						get_class($this),
100
+						$regex
101
+					)
102
+				);
103
+			}
104
+			$this->version = (int) $matches[1] . '.' . (int) $matches[2] . '.' . (int) $matches[3];
105
+		}
106
+		return $this->version;
107
+	}
108 108
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
                 get_class($this),
93 93
                 $matches
94 94
             );
95
-            if (! $success) {
95
+            if ( ! $success) {
96 96
                 throw new EE_Error(
97 97
                     sprintf(
98 98
                         __('The class %1$s was misnamed. It name should match the regex "%2$s"', 'event_espresso'),
@@ -101,7 +101,7 @@  discard block
 block discarded – undo
101 101
                     )
102 102
                 );
103 103
             }
104
-            $this->version = (int) $matches[1] . '.' . (int) $matches[2] . '.' . (int) $matches[3];
104
+            $this->version = (int) $matches[1].'.'.(int) $matches[2].'.'.(int) $matches[3];
105 105
         }
106 106
         return $this->version;
107 107
     }
Please login to merge, or discard this patch.
core/libraries/rest_api/changes/ChangesIn40836.php 2 patches
Indentation   +160 added lines, -160 removed lines patch added patch discarded remove patch
@@ -14,174 +14,174 @@
 block discarded – undo
14 14
 class ChangesIn40836 extends ChangesInBase
15 15
 {
16 16
 
17
-    /**
18
-     * Adds hooks so requests to 4.8.29 don't have the checkin endpoints
19
-     */
20
-    public function setHooks()
21
-    {
22
-        // set a hook to remove the "calculate" query param
23
-        add_filter(
24
-            'FHEE__EED_Core_Rest_Api___get_response_selection_query_params',
25
-            array($this, 'removeCalculateQueryParam'),
26
-            10,
27
-            3
28
-        );
29
-        // don't add the _calculated_fields either
30
-        add_filter(
31
-            'FHEE__Read__create_entity_from_wpdb_results__entity_before_inaccessible_field_removal',
32
-            array($this, 'removeCalculatedFieldsFromResponse'),
33
-            10,
34
-            5
35
-        );
36
-        // and also don't add the count headers
37
-        add_filter(
38
-            'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_response_headers',
39
-            array($this, 'removeHeadersNewInThisVersion'),
40
-            10,
41
-            3
42
-        );
43
-        // remove the old featured_image part of the response...
44
-        add_filter(
45
-            'FHEE__Read__create_entity_from_wpdb_results__entity_before_including_requested_models',
46
-            array($this, 'addOldFeaturedImagePartOfCptEntities'),
47
-            10,
48
-            5
49
-        );
50
-        // assuming ticket 9425's change gets pushed with 9406, we don't need to
51
-        // remove it from the calculated fields on older requests (because this will
52
-        // be the first version with calculated fields)
53
-        // before this, infinity was -1, now it's null
54
-        add_filter(
55
-            'FHEE__EventEspresso\core\libraries\rest_api\Model_Data_Translator__prepare_field_for_rest_api',
56
-            array($this, 'useNegativeOneForInfinityBeforeThisVersion'),
57
-            10,
58
-            4
59
-        );
60
-    }
17
+	/**
18
+	 * Adds hooks so requests to 4.8.29 don't have the checkin endpoints
19
+	 */
20
+	public function setHooks()
21
+	{
22
+		// set a hook to remove the "calculate" query param
23
+		add_filter(
24
+			'FHEE__EED_Core_Rest_Api___get_response_selection_query_params',
25
+			array($this, 'removeCalculateQueryParam'),
26
+			10,
27
+			3
28
+		);
29
+		// don't add the _calculated_fields either
30
+		add_filter(
31
+			'FHEE__Read__create_entity_from_wpdb_results__entity_before_inaccessible_field_removal',
32
+			array($this, 'removeCalculatedFieldsFromResponse'),
33
+			10,
34
+			5
35
+		);
36
+		// and also don't add the count headers
37
+		add_filter(
38
+			'FHEE__EventEspresso\core\libraries\rest_api\controllers\Base___get_response_headers',
39
+			array($this, 'removeHeadersNewInThisVersion'),
40
+			10,
41
+			3
42
+		);
43
+		// remove the old featured_image part of the response...
44
+		add_filter(
45
+			'FHEE__Read__create_entity_from_wpdb_results__entity_before_including_requested_models',
46
+			array($this, 'addOldFeaturedImagePartOfCptEntities'),
47
+			10,
48
+			5
49
+		);
50
+		// assuming ticket 9425's change gets pushed with 9406, we don't need to
51
+		// remove it from the calculated fields on older requests (because this will
52
+		// be the first version with calculated fields)
53
+		// before this, infinity was -1, now it's null
54
+		add_filter(
55
+			'FHEE__EventEspresso\core\libraries\rest_api\Model_Data_Translator__prepare_field_for_rest_api',
56
+			array($this, 'useNegativeOneForInfinityBeforeThisVersion'),
57
+			10,
58
+			4
59
+		);
60
+	}
61 61
 
62 62
 
63
-    /**
64
-     * Don't show "calculate" as an query param option in the index
65
-     *
66
-     * @param array    $query_params
67
-     * @param EEM_Base $model
68
-     * @param string   $version
69
-     * @return array
70
-     */
71
-    public function removeCalculateQueryParam($query_params, EEM_Base $model, $version)
72
-    {
73
-        if ($this->appliesToVersion($version)) {
74
-            unset($query_params['calculate']);
75
-        }
76
-        return $query_params;
77
-    }
63
+	/**
64
+	 * Don't show "calculate" as an query param option in the index
65
+	 *
66
+	 * @param array    $query_params
67
+	 * @param EEM_Base $model
68
+	 * @param string   $version
69
+	 * @return array
70
+	 */
71
+	public function removeCalculateQueryParam($query_params, EEM_Base $model, $version)
72
+	{
73
+		if ($this->appliesToVersion($version)) {
74
+			unset($query_params['calculate']);
75
+		}
76
+		return $query_params;
77
+	}
78 78
 
79 79
 
80
-    /**
81
-     * Removes the "_calculate_fields" part of entity responses before 4.8.36
82
-     *
83
-     * @param array           $entity_response_array
84
-     * @param EEM_Base        $model
85
-     * @param string          $request_context
86
-     * @param WP_REST_Request $request
87
-     * @param Read            $controller
88
-     * @return array
89
-     */
90
-    public function removeCalculatedFieldsFromResponse(
91
-        $entity_response_array,
92
-        EEM_Base $model,
93
-        $request_context,
94
-        WP_REST_Request $request,
95
-        Read $controller
96
-    ) {
97
-        if ($this->appliesToVersion($controller->getModelVersionInfo()->requestedVersion())) {
98
-            unset($entity_response_array['_calculated_fields']);
99
-        }
100
-        return $entity_response_array;
101
-    }
80
+	/**
81
+	 * Removes the "_calculate_fields" part of entity responses before 4.8.36
82
+	 *
83
+	 * @param array           $entity_response_array
84
+	 * @param EEM_Base        $model
85
+	 * @param string          $request_context
86
+	 * @param WP_REST_Request $request
87
+	 * @param Read            $controller
88
+	 * @return array
89
+	 */
90
+	public function removeCalculatedFieldsFromResponse(
91
+		$entity_response_array,
92
+		EEM_Base $model,
93
+		$request_context,
94
+		WP_REST_Request $request,
95
+		Read $controller
96
+	) {
97
+		if ($this->appliesToVersion($controller->getModelVersionInfo()->requestedVersion())) {
98
+			unset($entity_response_array['_calculated_fields']);
99
+		}
100
+		return $entity_response_array;
101
+	}
102 102
 
103 103
 
104
-    /**
105
-     * Removes the new headers for requests before 4.8.36
106
-     *
107
-     * @param array           $headers
108
-     * @param Controller_Base $controller
109
-     * @param string          $version
110
-     * @return array
111
-     */
112
-    public function removeHeadersNewInThisVersion(
113
-        $headers,
114
-        Controller_Base $controller,
115
-        $version
116
-    ) {
117
-        if ($this->appliesToVersion($version)) {
118
-            $headers = array_diff_key(
119
-                $headers,
120
-                array_flip(
121
-                    array(
122
-                        Base::HEADER_PREFIX_FOR_WP . 'Total',
123
-                        Base::HEADER_PREFIX_FOR_WP . 'TotalPages',
124
-                        Base::HEADER_PREFIX_FOR_WP . 'PageSize',
125
-                    )
126
-                )
127
-            );
128
-        }
129
-        return $headers;
130
-    }
104
+	/**
105
+	 * Removes the new headers for requests before 4.8.36
106
+	 *
107
+	 * @param array           $headers
108
+	 * @param Controller_Base $controller
109
+	 * @param string          $version
110
+	 * @return array
111
+	 */
112
+	public function removeHeadersNewInThisVersion(
113
+		$headers,
114
+		Controller_Base $controller,
115
+		$version
116
+	) {
117
+		if ($this->appliesToVersion($version)) {
118
+			$headers = array_diff_key(
119
+				$headers,
120
+				array_flip(
121
+					array(
122
+						Base::HEADER_PREFIX_FOR_WP . 'Total',
123
+						Base::HEADER_PREFIX_FOR_WP . 'TotalPages',
124
+						Base::HEADER_PREFIX_FOR_WP . 'PageSize',
125
+					)
126
+				)
127
+			);
128
+		}
129
+		return $headers;
130
+	}
131 131
 
132 132
 
133
-    /**
134
-     * Puts the 'featured_image_url' back in for responses before 4.8.36.
135
-     *
136
-     * @param array           $entity_response_array
137
-     * @param EEM_Base        $model
138
-     * @param string          $request_context
139
-     * @param WP_REST_Request $request
140
-     * @param Read            $controller
141
-     * @return array
142
-     */
143
-    public function addOldFeaturedImagePartOfCptEntities(
144
-        $entity_response_array,
145
-        EEM_Base $model,
146
-        $request_context,
147
-        WP_REST_Request $request,
148
-        Read $controller
149
-    ) {
150
-        if ($this->appliesToVersion($controller->getModelVersionInfo()->requestedVersion())
151
-            && $model instanceof \EEM_CPT_Base
152
-        ) {
153
-            $attachment = wp_get_attachment_image_src(
154
-                get_post_thumbnail_id($entity_response_array[ $model->primary_key_name() ]),
155
-                'full'
156
-            );
157
-            $entity_response_array['featured_image_url'] = ! empty($attachment) ? $attachment[0] : null;
158
-        }
159
-        return $entity_response_array;
160
-    }
133
+	/**
134
+	 * Puts the 'featured_image_url' back in for responses before 4.8.36.
135
+	 *
136
+	 * @param array           $entity_response_array
137
+	 * @param EEM_Base        $model
138
+	 * @param string          $request_context
139
+	 * @param WP_REST_Request $request
140
+	 * @param Read            $controller
141
+	 * @return array
142
+	 */
143
+	public function addOldFeaturedImagePartOfCptEntities(
144
+		$entity_response_array,
145
+		EEM_Base $model,
146
+		$request_context,
147
+		WP_REST_Request $request,
148
+		Read $controller
149
+	) {
150
+		if ($this->appliesToVersion($controller->getModelVersionInfo()->requestedVersion())
151
+			&& $model instanceof \EEM_CPT_Base
152
+		) {
153
+			$attachment = wp_get_attachment_image_src(
154
+				get_post_thumbnail_id($entity_response_array[ $model->primary_key_name() ]),
155
+				'full'
156
+			);
157
+			$entity_response_array['featured_image_url'] = ! empty($attachment) ? $attachment[0] : null;
158
+		}
159
+		return $entity_response_array;
160
+	}
161 161
 
162 162
 
163
-    /**
164
-     * If the value was infinity, we now use null in our JSON responses,
165
-     * but before this version we used -1.
166
-     *
167
-     * @param mixed                $new_value
168
-     * @param \EE_Model_Field_Base $field_obj
169
-     * @param mixed                $original_value
170
-     * @param string               $requested_value
171
-     * @return mixed
172
-     */
173
-    public function useNegativeOneForInfinityBeforeThisVersion(
174
-        $new_value,
175
-        $field_obj,
176
-        $original_value,
177
-        $requested_value
178
-    ) {
179
-        if ($this->appliesToVersion($requested_value)
180
-            && $original_value === EE_INF
181
-        ) {
182
-            // return the old representation of infinity in the JSON
183
-            return -1;
184
-        }
185
-        return $new_value;
186
-    }
163
+	/**
164
+	 * If the value was infinity, we now use null in our JSON responses,
165
+	 * but before this version we used -1.
166
+	 *
167
+	 * @param mixed                $new_value
168
+	 * @param \EE_Model_Field_Base $field_obj
169
+	 * @param mixed                $original_value
170
+	 * @param string               $requested_value
171
+	 * @return mixed
172
+	 */
173
+	public function useNegativeOneForInfinityBeforeThisVersion(
174
+		$new_value,
175
+		$field_obj,
176
+		$original_value,
177
+		$requested_value
178
+	) {
179
+		if ($this->appliesToVersion($requested_value)
180
+			&& $original_value === EE_INF
181
+		) {
182
+			// return the old representation of infinity in the JSON
183
+			return -1;
184
+		}
185
+		return $new_value;
186
+	}
187 187
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -119,9 +119,9 @@  discard block
 block discarded – undo
119 119
                 $headers,
120 120
                 array_flip(
121 121
                     array(
122
-                        Base::HEADER_PREFIX_FOR_WP . 'Total',
123
-                        Base::HEADER_PREFIX_FOR_WP . 'TotalPages',
124
-                        Base::HEADER_PREFIX_FOR_WP . 'PageSize',
122
+                        Base::HEADER_PREFIX_FOR_WP.'Total',
123
+                        Base::HEADER_PREFIX_FOR_WP.'TotalPages',
124
+                        Base::HEADER_PREFIX_FOR_WP.'PageSize',
125 125
                     )
126 126
                 )
127 127
             );
@@ -151,7 +151,7 @@  discard block
 block discarded – undo
151 151
             && $model instanceof \EEM_CPT_Base
152 152
         ) {
153 153
             $attachment = wp_get_attachment_image_src(
154
-                get_post_thumbnail_id($entity_response_array[ $model->primary_key_name() ]),
154
+                get_post_thumbnail_id($entity_response_array[$model->primary_key_name()]),
155 155
                 'full'
156 156
             );
157 157
             $entity_response_array['featured_image_url'] = ! empty($attachment) ? $attachment[0] : null;
Please login to merge, or discard this patch.
core/libraries/rest_api/ModelDataTranslator.php 2 patches
Indentation   +825 added lines, -825 removed lines patch added patch discarded remove patch
@@ -32,829 +32,829 @@
 block discarded – undo
32 32
 class ModelDataTranslator
33 33
 {
34 34
 
35
-    /**
36
-     * We used to use -1 for infinity in the rest api, but that's ambiguous for
37
-     * fields that COULD contain -1; so we use null
38
-     */
39
-    const EE_INF_IN_REST = null;
40
-
41
-
42
-    /**
43
-     * Prepares a possible array of input values from JSON for use by the models
44
-     *
45
-     * @param EE_Model_Field_Base $field_obj
46
-     * @param mixed               $original_value_maybe_array
47
-     * @param string              $requested_version
48
-     * @param string              $timezone_string treat values as being in this timezone
49
-     * @return mixed
50
-     * @throws RestException
51
-     */
52
-    public static function prepareFieldValuesFromJson(
53
-        $field_obj,
54
-        $original_value_maybe_array,
55
-        $requested_version,
56
-        $timezone_string = 'UTC'
57
-    ) {
58
-        if (is_array($original_value_maybe_array)
59
-            && ! $field_obj instanceof EE_Serialized_Text_Field
60
-        ) {
61
-            $new_value_maybe_array = array();
62
-            foreach ($original_value_maybe_array as $array_key => $array_item) {
63
-                $new_value_maybe_array[ $array_key ] = ModelDataTranslator::prepareFieldValueFromJson(
64
-                    $field_obj,
65
-                    $array_item,
66
-                    $requested_version,
67
-                    $timezone_string
68
-                );
69
-            }
70
-        } else {
71
-            $new_value_maybe_array = ModelDataTranslator::prepareFieldValueFromJson(
72
-                $field_obj,
73
-                $original_value_maybe_array,
74
-                $requested_version,
75
-                $timezone_string
76
-            );
77
-        }
78
-        return $new_value_maybe_array;
79
-    }
80
-
81
-
82
-    /**
83
-     * Prepares an array of field values FOR use in JSON/REST API
84
-     *
85
-     * @param EE_Model_Field_Base $field_obj
86
-     * @param mixed               $original_value_maybe_array
87
-     * @param string              $request_version (eg 4.8.36)
88
-     * @return array
89
-     */
90
-    public static function prepareFieldValuesForJson($field_obj, $original_value_maybe_array, $request_version)
91
-    {
92
-        if (is_array($original_value_maybe_array)) {
93
-            $new_value = array();
94
-            foreach ($original_value_maybe_array as $key => $value) {
95
-                $new_value[ $key ] = ModelDataTranslator::prepareFieldValuesForJson(
96
-                    $field_obj,
97
-                    $value,
98
-                    $request_version
99
-                );
100
-            }
101
-        } else {
102
-            $new_value = ModelDataTranslator::prepareFieldValueForJson(
103
-                $field_obj,
104
-                $original_value_maybe_array,
105
-                $request_version
106
-            );
107
-        }
108
-        return $new_value;
109
-    }
110
-
111
-
112
-    /**
113
-     * Prepares incoming data from the json or $_REQUEST parameters for the models'
114
-     * "$query_params".
115
-     *
116
-     * @param EE_Model_Field_Base $field_obj
117
-     * @param mixed               $original_value
118
-     * @param string              $requested_version
119
-     * @param string              $timezone_string treat values as being in this timezone
120
-     * @return mixed
121
-     * @throws RestException
122
-     * @throws DomainException
123
-     * @throws EE_Error
124
-     */
125
-    public static function prepareFieldValueFromJson(
126
-        $field_obj,
127
-        $original_value,
128
-        $requested_version,
129
-        $timezone_string = 'UTC' // UTC
130
-    ) {
131
-        // check if they accidentally submitted an error value. If so throw an exception
132
-        if (is_array($original_value)
133
-            && isset($original_value['error_code'], $original_value['error_message'])) {
134
-            throw new RestException(
135
-                'rest_submitted_error_value',
136
-                sprintf(
137
-                    esc_html__(
138
-                        'You tried to submit a JSON error object as a value for %1$s. That\'s not allowed.',
139
-                        'event_espresso'
140
-                    ),
141
-                    $field_obj->get_name()
142
-                ),
143
-                array(
144
-                    'status' => 400,
145
-                )
146
-            );
147
-        }
148
-        // double-check for serialized PHP. We never accept serialized PHP. No way Jose.
149
-        ModelDataTranslator::throwExceptionIfContainsSerializedData($original_value);
150
-        $timezone_string = $timezone_string !== '' ? $timezone_string : get_option('timezone_string', '');
151
-        $new_value = null;
152
-        // walk through the submitted data and double-check for serialized PHP. We never accept serialized PHP. No
153
-        // way Jose.
154
-        ModelDataTranslator::throwExceptionIfContainsSerializedData($original_value);
155
-        if ($field_obj instanceof EE_Infinite_Integer_Field
156
-            && in_array($original_value, array(null, ''), true)
157
-        ) {
158
-            $new_value = EE_INF;
159
-        } elseif ($field_obj instanceof EE_Datetime_Field) {
160
-            $new_value = rest_parse_date(
161
-                self::getTimestampWithTimezoneOffset($original_value, $field_obj, $timezone_string)
162
-            );
163
-            if ($new_value === false) {
164
-                throw new RestException(
165
-                    'invalid_format_for_timestamp',
166
-                    sprintf(
167
-                        esc_html__(
168
-                            'Timestamps received on a request as the value for Date and Time fields must be in %1$s/%2$s format.  The timestamp provided (%3$s) is not that format.',
169
-                            'event_espresso'
170
-                        ),
171
-                        'RFC3339',
172
-                        'ISO8601',
173
-                        $original_value
174
-                    ),
175
-                    array(
176
-                        'status' => 400,
177
-                    )
178
-                );
179
-            }
180
-        } else {
181
-            $new_value = $original_value;
182
-        }
183
-        return $new_value;
184
-    }
185
-
186
-
187
-    /**
188
-     * This checks if the incoming timestamp has timezone information already on it and if it doesn't then adds timezone
189
-     * information via details obtained from the host site.
190
-     *
191
-     * @param string            $original_timestamp
192
-     * @param EE_Datetime_Field $datetime_field
193
-     * @param                   $timezone_string
194
-     * @return string
195
-     * @throws DomainException
196
-     */
197
-    private static function getTimestampWithTimezoneOffset(
198
-        $original_timestamp,
199
-        EE_Datetime_Field $datetime_field,
200
-        $timezone_string
201
-    ) {
202
-        // already have timezone information?
203
-        if (preg_match('/Z|(\+|\-)(\d{2}:\d{2})/', $original_timestamp)) {
204
-            // yes, we're ignoring the timezone.
205
-            return $original_timestamp;
206
-        }
207
-        // need to append timezone
208
-        list($offset_sign, $offset_secs) = self::parseTimezoneOffset(
209
-            $datetime_field->get_timezone_offset(
210
-                new \DateTimeZone($timezone_string),
211
-                $original_timestamp
212
-            )
213
-        );
214
-        $offset_string =
215
-            str_pad(
216
-                floor($offset_secs / HOUR_IN_SECONDS),
217
-                2,
218
-                '0',
219
-                STR_PAD_LEFT
220
-            )
221
-            . ':'
222
-            . str_pad(
223
-                ($offset_secs % HOUR_IN_SECONDS) / MINUTE_IN_SECONDS,
224
-                2,
225
-                '0',
226
-                STR_PAD_LEFT
227
-            );
228
-        return $original_timestamp . $offset_sign . $offset_string;
229
-    }
230
-
231
-
232
-    /**
233
-     * Throws an exception if $data is a serialized PHP string (or somehow an actually PHP object, although I don't
234
-     * think that can happen). If $data is an array, recurses into its keys and values
235
-     *
236
-     * @param mixed $data
237
-     * @throws RestException
238
-     * @return void
239
-     */
240
-    public static function throwExceptionIfContainsSerializedData($data)
241
-    {
242
-        if (is_array($data)) {
243
-            foreach ($data as $key => $value) {
244
-                ModelDataTranslator::throwExceptionIfContainsSerializedData($key);
245
-                ModelDataTranslator::throwExceptionIfContainsSerializedData($value);
246
-            }
247
-        } else {
248
-            if (is_serialized($data) || is_object($data)) {
249
-                throw new RestException(
250
-                    'serialized_data_submission_prohibited',
251
-                    esc_html__(
252
-                    // @codingStandardsIgnoreStart
253
-                        'You tried to submit a string of serialized text. Serialized PHP is prohibited over the EE4 REST API.',
254
-                        // @codingStandardsIgnoreEnd
255
-                        'event_espresso'
256
-                    )
257
-                );
258
-            }
259
-        }
260
-    }
261
-
262
-
263
-    /**
264
-     * determines what's going on with them timezone strings
265
-     *
266
-     * @param int $timezone_offset
267
-     * @return array
268
-     */
269
-    private static function parseTimezoneOffset($timezone_offset)
270
-    {
271
-        $first_char = substr((string) $timezone_offset, 0, 1);
272
-        if ($first_char === '+' || $first_char === '-') {
273
-            $offset_sign = $first_char;
274
-            $offset_secs = substr((string) $timezone_offset, 1);
275
-        } else {
276
-            $offset_sign = '+';
277
-            $offset_secs = $timezone_offset;
278
-        }
279
-        return array($offset_sign, $offset_secs);
280
-    }
281
-
282
-
283
-    /**
284
-     * Prepares a field's value for display in the API
285
-     *
286
-     * @param EE_Model_Field_Base $field_obj
287
-     * @param mixed               $original_value
288
-     * @param string              $requested_version
289
-     * @return mixed
290
-     */
291
-    public static function prepareFieldValueForJson($field_obj, $original_value, $requested_version)
292
-    {
293
-        if ($original_value === EE_INF) {
294
-            $new_value = ModelDataTranslator::EE_INF_IN_REST;
295
-        } elseif ($field_obj instanceof EE_Datetime_Field) {
296
-            if (is_string($original_value)) {
297
-                // did they submit a string of a unix timestamp?
298
-                if (is_numeric($original_value)) {
299
-                    $datetime_obj = new \DateTime();
300
-                    $datetime_obj->setTimestamp((int) $original_value);
301
-                } else {
302
-                    // first, check if its a MySQL timestamp in GMT
303
-                    $datetime_obj = \DateTime::createFromFormat('Y-m-d H:i:s', $original_value);
304
-                }
305
-                if (! $datetime_obj instanceof \DateTime) {
306
-                    // so it's not a unix timestamp or a MySQL timestamp. Maybe its in the field's date/time format?
307
-                    $datetime_obj = $field_obj->prepare_for_set($original_value);
308
-                }
309
-                $original_value = $datetime_obj;
310
-            }
311
-            if ($original_value instanceof \DateTime) {
312
-                $new_value = $original_value->format('Y-m-d H:i:s');
313
-            } elseif (is_int($original_value) || is_float($original_value)) {
314
-                $new_value = date('Y-m-d H:i:s', $original_value);
315
-            } elseif ($original_value === null || $original_value === '') {
316
-                $new_value = null;
317
-            } else {
318
-                // so it's not a datetime object, unix timestamp (as string or int),
319
-                // MySQL timestamp, or even a string in the field object's format. So no idea what it is
320
-                throw new \EE_Error(
321
-                    sprintf(
322
-                        esc_html__(
323
-                        // @codingStandardsIgnoreStart
324
-                            'The value "%1$s" for the field "%2$s" on model "%3$s" could not be understood. It should be a PHP DateTime, unix timestamp, MySQL date, or string in the format "%4$s".',
325
-                            // @codingStandardsIgnoreEnd
326
-                            'event_espresso'
327
-                        ),
328
-                        $original_value,
329
-                        $field_obj->get_name(),
330
-                        $field_obj->get_model_name(),
331
-                        $field_obj->get_time_format() . ' ' . $field_obj->get_time_format()
332
-                    )
333
-                );
334
-            }
335
-            $new_value = mysql_to_rfc3339($new_value);
336
-        } else {
337
-            $new_value = $original_value;
338
-        }
339
-        // are we about to send an object? just don't. We have no good way to represent it in JSON.
340
-        // can't just check using is_object() because that missed PHP incomplete objects
341
-        if (! ModelDataTranslator::isRepresentableInJson($new_value)) {
342
-            $new_value = array(
343
-                'error_code'    => 'php_object_not_return',
344
-                'error_message' => esc_html__(
345
-                    'The value of this field in the database is a PHP object, which can\'t be represented in JSON.',
346
-                    'event_espresso'
347
-                ),
348
-            );
349
-        }
350
-        return apply_filters(
351
-            'FHEE__EventEspresso\core\libraries\rest_api\Model_Data_Translator__prepare_field_for_rest_api',
352
-            $new_value,
353
-            $field_obj,
354
-            $original_value,
355
-            $requested_version
356
-        );
357
-    }
358
-
359
-
360
-    /**
361
-     * Prepares condition-query-parameters (like what's in where and having) from
362
-     * the format expected in the API to use in the models
363
-     *
364
-     * @param array    $inputted_query_params_of_this_type
365
-     * @param EEM_Base $model
366
-     * @param string   $requested_version
367
-     * @param boolean  $writing whether this data will be written to the DB, or if we're just building a query.
368
-     *                          If we're writing to the DB, we don't expect any operators, or any logic query
369
-     *                          parameters, and we also won't accept serialized data unless the current user has
370
-     *                          unfiltered_html.
371
-     * @return array
372
-     * @throws DomainException
373
-     * @throws RestException
374
-     * @throws EE_Error
375
-     */
376
-    public static function prepareConditionsQueryParamsForModels(
377
-        $inputted_query_params_of_this_type,
378
-        EEM_Base $model,
379
-        $requested_version,
380
-        $writing = false
381
-    ) {
382
-        $query_param_for_models = array();
383
-        $valid_operators = $model->valid_operators();
384
-        foreach ($inputted_query_params_of_this_type as $query_param_key => $query_param_value) {
385
-            $is_gmt_datetime_field = false;
386
-            $query_param_sans_stars = ModelDataTranslator::removeStarsAndAnythingAfterFromConditionQueryParamKey(
387
-                $query_param_key
388
-            );
389
-            $field = ModelDataTranslator::deduceFieldFromQueryParam(
390
-                $query_param_sans_stars,
391
-                $model
392
-            );
393
-            // double-check is it a *_gmt field?
394
-            if (! $field instanceof EE_Model_Field_Base
395
-                && ModelDataTranslator::isGmtDateFieldName($query_param_sans_stars)
396
-            ) {
397
-                // yep, take off '_gmt', and find the field
398
-                $query_param_key = ModelDataTranslator::removeGmtFromFieldName($query_param_sans_stars);
399
-                $field = ModelDataTranslator::deduceFieldFromQueryParam(
400
-                    $query_param_key,
401
-                    $model
402
-                );
403
-                $timezone = 'UTC';
404
-                $is_gmt_datetime_field = true;
405
-            } elseif ($field instanceof EE_Datetime_Field) {
406
-                // so it's not a GMT field. Set the timezone on the model to the default
407
-                $timezone = \EEH_DTT_Helper::get_valid_timezone_string();
408
-            } else {
409
-                // just keep using what's already set for the timezone
410
-                $timezone = $model->get_timezone();
411
-            }
412
-            if ($field instanceof EE_Model_Field_Base) {
413
-                if (! $writing && is_array($query_param_value)) {
414
-                    if (! \EEH_Array::is_array_numerically_and_sequentially_indexed($query_param_value)) {
415
-                        if (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE) {
416
-                            throw new RestException(
417
-                                'numerically_indexed_array_of_values_only',
418
-                                sprintf(
419
-                                    esc_html__(
420
-                                        'The array provided for the parameter "%1$s" should be numerically indexed.',
421
-                                        'event_espresso'
422
-                                    ),
423
-                                    $query_param_key
424
-                                ),
425
-                                array(
426
-                                    'status' => 400,
427
-                                )
428
-                            );
429
-                        }
430
-                    }
431
-                    // did they specify an operator?
432
-                    if (isset($query_param_value[0])
433
-                        && isset($valid_operators[ $query_param_value[0] ])
434
-                    ) {
435
-                        $op = $query_param_value[0];
436
-                        $translated_value = array($op);
437
-                        if (array_key_exists($op, $model->valid_in_style_operators())
438
-                            && isset($query_param_value[1])
439
-                            && ! isset($query_param_value[2])
440
-                        ) {
441
-                            $translated_value[] = ModelDataTranslator::prepareFieldValuesFromJson(
442
-                                $field,
443
-                                $query_param_value[1],
444
-                                $requested_version,
445
-                                $timezone
446
-                            );
447
-                        } elseif (array_key_exists($op, $model->valid_between_style_operators())
448
-                                  && isset($query_param_value[1], $query_param_value[2])
449
-                                  && ! isset($query_param_value[3])
450
-                        ) {
451
-                            $translated_value[] = ModelDataTranslator::prepareFieldValuesFromJson(
452
-                                $field,
453
-                                $query_param_value[1],
454
-                                $requested_version,
455
-                                $timezone
456
-                            );
457
-                            $translated_value[] = ModelDataTranslator::prepareFieldValuesFromJson(
458
-                                $field,
459
-                                $query_param_value[2],
460
-                                $requested_version,
461
-                                $timezone
462
-                            );
463
-                        } elseif (array_key_exists($op, $model->valid_like_style_operators())
464
-                                  && isset($query_param_value[1])
465
-                                  && ! isset($query_param_value[2])
466
-                        ) {
467
-                            // we want to leave this value mostly-as-is (eg don't force it to be a float
468
-                            // or a boolean or an enum value. Leave it as-is with wildcards etc)
469
-                            // but do verify it at least doesn't have any serialized data
470
-                            ModelDataTranslator::throwExceptionIfContainsSerializedData($query_param_value[1]);
471
-                            $translated_value[] = $query_param_value[1];
472
-                        } elseif (array_key_exists($op, $model->valid_null_style_operators())
473
-                                  && ! isset($query_param_value[1])) {
474
-                            // no arguments should have been provided, so don't look for any
475
-                        } elseif (isset($query_param_value[1])
476
-                                  && ! isset($query_param_value[2])
477
-                                  && ! array_key_exists(
478
-                                      $op,
479
-                                      array_merge(
480
-                                          $model->valid_in_style_operators(),
481
-                                          $model->valid_null_style_operators(),
482
-                                          $model->valid_like_style_operators(),
483
-                                          $model->valid_between_style_operators()
484
-                                      )
485
-                                  )
486
-                        ) {
487
-                            // it's a valid operator, but none of the exceptions. Treat it normally.
488
-                            $translated_value[] = ModelDataTranslator::prepareFieldValuesFromJson(
489
-                                $field,
490
-                                $query_param_value[1],
491
-                                $requested_version,
492
-                                $timezone
493
-                            );
494
-                        } else {
495
-                            // so they provided a valid operator, but wrong number of arguments
496
-                            if (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE) {
497
-                                throw new RestException(
498
-                                    'wrong_number_of_arguments',
499
-                                    sprintf(
500
-                                        esc_html__(
501
-                                            'The operator you provided, "%1$s" had the wrong number of arguments',
502
-                                            'event_espresso'
503
-                                        ),
504
-                                        $op
505
-                                    ),
506
-                                    array(
507
-                                        'status' => 400,
508
-                                    )
509
-                                );
510
-                            }
511
-                            $translated_value = null;
512
-                        }
513
-                    } else {
514
-                        // so they didn't provide a valid operator
515
-                        if (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE) {
516
-                            throw new RestException(
517
-                                'invalid_operator',
518
-                                sprintf(
519
-                                    esc_html__(
520
-                                        'You provided an invalid parameter, with key "%1$s" and value "%2$s"',
521
-                                        'event_espresso'
522
-                                    ),
523
-                                    $query_param_key,
524
-                                    $query_param_value
525
-                                ),
526
-                                array(
527
-                                    'status' => 400,
528
-                                )
529
-                            );
530
-                        }
531
-                        // if we aren't in debug mode, then just try our best to fulfill the user's request
532
-                        $translated_value = null;
533
-                    }
534
-                } else {
535
-                    $translated_value = ModelDataTranslator::prepareFieldValueFromJson(
536
-                        $field,
537
-                        $query_param_value,
538
-                        $requested_version,
539
-                        $timezone
540
-                    );
541
-                }
542
-                if ((isset($query_param_for_models[ $query_param_key ]) && $is_gmt_datetime_field)
543
-                    || $translated_value === null
544
-                ) {
545
-                    // they have already provided a non-gmt field, ignore the gmt one. That's what WP core
546
-                    // currently does (they might change it though). See https://core.trac.wordpress.org/ticket/39954
547
-                    // OR we couldn't create a translated value from their input
548
-                    continue;
549
-                }
550
-                $query_param_for_models[ $query_param_key ] = $translated_value;
551
-            } else {
552
-                // so this param doesn't correspond to a field eh?
553
-                if ($writing) {
554
-                    // always tell API clients about invalid parameters when they're creating data. Otherwise,
555
-                    // they are probably going to create invalid data
556
-                    throw new RestException(
557
-                        'invalid_field',
558
-                        sprintf(
559
-                            esc_html__('You have provided an invalid parameter: "%1$s"', 'event_espresso'),
560
-                            $query_param_key
561
-                        )
562
-                    );
563
-                } else {
564
-                    // so it's not for a field, is it a logic query param key?
565
-                    if (in_array(
566
-                        $query_param_sans_stars,
567
-                        $model->logic_query_param_keys()
568
-                    )) {
569
-                        $query_param_for_models[ $query_param_key ] = ModelDataTranslator::prepareConditionsQueryParamsForModels(
570
-                            $query_param_value,
571
-                            $model,
572
-                            $requested_version
573
-                        );
574
-                    } elseif (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE) {
575
-                        // only tell API clients they got it wrong if we're in debug mode
576
-                        // otherwise try our best ot fulfill their request by ignoring this invalid data
577
-                        throw new RestException(
578
-                            'invalid_parameter',
579
-                            sprintf(
580
-                                esc_html__(
581
-                                    'You provided an invalid parameter, with key "%1$s"',
582
-                                    'event_espresso'
583
-                                ),
584
-                                $query_param_sans_stars
585
-                            ),
586
-                            array(
587
-                                'status' => 400,
588
-                            )
589
-                        );
590
-                    }
591
-                }
592
-            }
593
-        }
594
-        return $query_param_for_models;
595
-    }
596
-
597
-
598
-    /**
599
-     * Mostly checks if the last 4 characters are "_gmt", indicating its a
600
-     * gmt date field name
601
-     *
602
-     * @param string $field_name
603
-     * @return boolean
604
-     */
605
-    public static function isGmtDateFieldName($field_name)
606
-    {
607
-        return substr(
608
-            ModelDataTranslator::removeStarsAndAnythingAfterFromConditionQueryParamKey($field_name),
609
-            -4,
610
-            4
611
-        ) === '_gmt';
612
-    }
613
-
614
-
615
-    /**
616
-     * Removes the last "_gmt" part of a field name (and if there is no "_gmt" at the end, leave it alone)
617
-     *
618
-     * @param string $field_name
619
-     * @return string
620
-     */
621
-    public static function removeGmtFromFieldName($field_name)
622
-    {
623
-        if (! ModelDataTranslator::isGmtDateFieldName($field_name)) {
624
-            return $field_name;
625
-        }
626
-        $query_param_sans_stars = ModelDataTranslator::removeStarsAndAnythingAfterFromConditionQueryParamKey(
627
-            $field_name
628
-        );
629
-        $query_param_sans_gmt_and_sans_stars = substr(
630
-            $query_param_sans_stars,
631
-            0,
632
-            strrpos(
633
-                $field_name,
634
-                '_gmt'
635
-            )
636
-        );
637
-        return str_replace($query_param_sans_stars, $query_param_sans_gmt_and_sans_stars, $field_name);
638
-    }
639
-
640
-
641
-    /**
642
-     * Takes a field name from the REST API and prepares it for the model querying
643
-     *
644
-     * @param string $field_name
645
-     * @return string
646
-     */
647
-    public static function prepareFieldNameFromJson($field_name)
648
-    {
649
-        if (ModelDataTranslator::isGmtDateFieldName($field_name)) {
650
-            return ModelDataTranslator::removeGmtFromFieldName($field_name);
651
-        }
652
-        return $field_name;
653
-    }
654
-
655
-
656
-    /**
657
-     * Takes array of field names from REST API and prepares for models
658
-     *
659
-     * @param array $field_names
660
-     * @return array of field names (possibly include model prefixes)
661
-     */
662
-    public static function prepareFieldNamesFromJson(array $field_names)
663
-    {
664
-        $new_array = array();
665
-        foreach ($field_names as $key => $field_name) {
666
-            $new_array[ $key ] = ModelDataTranslator::prepareFieldNameFromJson($field_name);
667
-        }
668
-        return $new_array;
669
-    }
670
-
671
-
672
-    /**
673
-     * Takes array where array keys are field names (possibly with model path prefixes)
674
-     * from the REST API and prepares them for model querying
675
-     *
676
-     * @param array $field_names_as_keys
677
-     * @return array
678
-     */
679
-    public static function prepareFieldNamesInArrayKeysFromJson(array $field_names_as_keys)
680
-    {
681
-        $new_array = array();
682
-        foreach ($field_names_as_keys as $field_name => $value) {
683
-            $new_array[ ModelDataTranslator::prepareFieldNameFromJson($field_name) ] = $value;
684
-        }
685
-        return $new_array;
686
-    }
687
-
688
-
689
-    /**
690
-     * Prepares an array of model query params for use in the REST API
691
-     *
692
-     * @param array    $model_query_params
693
-     * @param EEM_Base $model
694
-     * @param string   $requested_version  eg "4.8.36". If null is provided, defaults to the latest release of the EE4
695
-     *                                     REST API
696
-     * @return array which can be passed into the EE4 REST API when querying a model resource
697
-     * @throws EE_Error
698
-     */
699
-    public static function prepareQueryParamsForRestApi(
700
-        array $model_query_params,
701
-        EEM_Base $model,
702
-        $requested_version = null
703
-    ) {
704
-        if ($requested_version === null) {
705
-            $requested_version = \EED_Core_Rest_Api::latest_rest_api_version();
706
-        }
707
-        $rest_query_params = $model_query_params;
708
-        if (isset($model_query_params[0])) {
709
-            $rest_query_params['where'] = ModelDataTranslator::prepareConditionsQueryParamsForRestApi(
710
-                $model_query_params[0],
711
-                $model,
712
-                $requested_version
713
-            );
714
-            unset($rest_query_params[0]);
715
-        }
716
-        if (isset($model_query_params['having'])) {
717
-            $rest_query_params['having'] = ModelDataTranslator::prepareConditionsQueryParamsForRestApi(
718
-                $model_query_params['having'],
719
-                $model,
720
-                $requested_version
721
-            );
722
-        }
723
-        return apply_filters(
724
-            'FHEE__EventEspresso\core\libraries\rest_api\Model_Data_Translator__prepare_query_params_for_rest_api',
725
-            $rest_query_params,
726
-            $model_query_params,
727
-            $model,
728
-            $requested_version
729
-        );
730
-    }
731
-
732
-
733
-    /**
734
-     * Prepares all the sub-conditions query parameters (eg having or where conditions) for use in the rest api
735
-     *
736
-     * @param array    $inputted_query_params_of_this_type  eg like the "where" or "having" conditions query params
737
-     *                                                      passed into EEM_Base::get_all()
738
-     * @param EEM_Base $model
739
-     * @param string   $requested_version                   eg "4.8.36"
740
-     * @return array ready for use in the rest api query params
741
-     * @throws EE_Error
742
-     * @throws ObjectDetectedException if somehow a PHP object were in the query params' values,
743
-     *                                                      (which would be really unusual)
744
-     */
745
-    public static function prepareConditionsQueryParamsForRestApi(
746
-        $inputted_query_params_of_this_type,
747
-        EEM_Base $model,
748
-        $requested_version
749
-    ) {
750
-        $query_param_for_models = array();
751
-        foreach ($inputted_query_params_of_this_type as $query_param_key => $query_param_value) {
752
-            $field = ModelDataTranslator::deduceFieldFromQueryParam(
753
-                ModelDataTranslator::removeStarsAndAnythingAfterFromConditionQueryParamKey($query_param_key),
754
-                $model
755
-            );
756
-            if ($field instanceof EE_Model_Field_Base) {
757
-                // did they specify an operator?
758
-                if (is_array($query_param_value)) {
759
-                    $op = $query_param_value[0];
760
-                    $translated_value = array($op);
761
-                    if (isset($query_param_value[1])) {
762
-                        $value = $query_param_value[1];
763
-                        $translated_value[1] = ModelDataTranslator::prepareFieldValuesForJson(
764
-                            $field,
765
-                            $value,
766
-                            $requested_version
767
-                        );
768
-                    }
769
-                } else {
770
-                    $translated_value = ModelDataTranslator::prepareFieldValueForJson(
771
-                        $field,
772
-                        $query_param_value,
773
-                        $requested_version
774
-                    );
775
-                }
776
-                $query_param_for_models[ $query_param_key ] = $translated_value;
777
-            } else {
778
-                // so it's not for a field, assume it's a logic query param key
779
-                $query_param_for_models[ $query_param_key ] = ModelDataTranslator::prepareConditionsQueryParamsForRestApi(
780
-                    $query_param_value,
781
-                    $model,
782
-                    $requested_version
783
-                );
784
-            }
785
-        }
786
-        return $query_param_for_models;
787
-    }
788
-
789
-
790
-    /**
791
-     * @param $condition_query_param_key
792
-     * @return string
793
-     */
794
-    public static function removeStarsAndAnythingAfterFromConditionQueryParamKey($condition_query_param_key)
795
-    {
796
-        $pos_of_star = strpos($condition_query_param_key, '*');
797
-        if ($pos_of_star === false) {
798
-            return $condition_query_param_key;
799
-        } else {
800
-            $condition_query_param_sans_star = substr($condition_query_param_key, 0, $pos_of_star);
801
-            return $condition_query_param_sans_star;
802
-        }
803
-    }
804
-
805
-
806
-    /**
807
-     * Takes the input parameter and finds the model field that it indicates.
808
-     *
809
-     * @param string   $query_param_name like Registration.Transaction.TXN_ID, Event.Datetime.start_time, or REG_ID
810
-     * @param EEM_Base $model
811
-     * @return EE_Model_Field_Base
812
-     * @throws EE_Error
813
-     */
814
-    public static function deduceFieldFromQueryParam($query_param_name, EEM_Base $model)
815
-    {
816
-        // ok, now proceed with deducing which part is the model's name, and which is the field's name
817
-        // which will help us find the database table and column
818
-        $query_param_parts = explode('.', $query_param_name);
819
-        if (empty($query_param_parts)) {
820
-            throw new EE_Error(
821
-                sprintf(
822
-                    __(
823
-                        '_extract_column_name is empty when trying to extract column and table name from %s',
824
-                        'event_espresso'
825
-                    ),
826
-                    $query_param_name
827
-                )
828
-            );
829
-        }
830
-        $number_of_parts = count($query_param_parts);
831
-        $last_query_param_part = $query_param_parts[ count($query_param_parts) - 1 ];
832
-        if ($number_of_parts === 1) {
833
-            $field_name = $last_query_param_part;
834
-        } else {// $number_of_parts >= 2
835
-            // the last part is the column name, and there are only 2parts. therefore...
836
-            $field_name = $last_query_param_part;
837
-            $model = \EE_Registry::instance()->load_model($query_param_parts[ $number_of_parts - 2 ]);
838
-        }
839
-        try {
840
-            return $model->field_settings_for($field_name, false);
841
-        } catch (EE_Error $e) {
842
-            return null;
843
-        }
844
-    }
845
-
846
-
847
-    /**
848
-     * Returns true if $data can be easily represented in JSON.
849
-     * Basically, objects and resources can't be represented in JSON easily.
850
-     *
851
-     * @param mixed $data
852
-     * @return bool
853
-     */
854
-    protected static function isRepresentableInJson($data)
855
-    {
856
-        return is_scalar($data)
857
-               || is_array($data)
858
-               || is_null($data);
859
-    }
35
+	/**
36
+	 * We used to use -1 for infinity in the rest api, but that's ambiguous for
37
+	 * fields that COULD contain -1; so we use null
38
+	 */
39
+	const EE_INF_IN_REST = null;
40
+
41
+
42
+	/**
43
+	 * Prepares a possible array of input values from JSON for use by the models
44
+	 *
45
+	 * @param EE_Model_Field_Base $field_obj
46
+	 * @param mixed               $original_value_maybe_array
47
+	 * @param string              $requested_version
48
+	 * @param string              $timezone_string treat values as being in this timezone
49
+	 * @return mixed
50
+	 * @throws RestException
51
+	 */
52
+	public static function prepareFieldValuesFromJson(
53
+		$field_obj,
54
+		$original_value_maybe_array,
55
+		$requested_version,
56
+		$timezone_string = 'UTC'
57
+	) {
58
+		if (is_array($original_value_maybe_array)
59
+			&& ! $field_obj instanceof EE_Serialized_Text_Field
60
+		) {
61
+			$new_value_maybe_array = array();
62
+			foreach ($original_value_maybe_array as $array_key => $array_item) {
63
+				$new_value_maybe_array[ $array_key ] = ModelDataTranslator::prepareFieldValueFromJson(
64
+					$field_obj,
65
+					$array_item,
66
+					$requested_version,
67
+					$timezone_string
68
+				);
69
+			}
70
+		} else {
71
+			$new_value_maybe_array = ModelDataTranslator::prepareFieldValueFromJson(
72
+				$field_obj,
73
+				$original_value_maybe_array,
74
+				$requested_version,
75
+				$timezone_string
76
+			);
77
+		}
78
+		return $new_value_maybe_array;
79
+	}
80
+
81
+
82
+	/**
83
+	 * Prepares an array of field values FOR use in JSON/REST API
84
+	 *
85
+	 * @param EE_Model_Field_Base $field_obj
86
+	 * @param mixed               $original_value_maybe_array
87
+	 * @param string              $request_version (eg 4.8.36)
88
+	 * @return array
89
+	 */
90
+	public static function prepareFieldValuesForJson($field_obj, $original_value_maybe_array, $request_version)
91
+	{
92
+		if (is_array($original_value_maybe_array)) {
93
+			$new_value = array();
94
+			foreach ($original_value_maybe_array as $key => $value) {
95
+				$new_value[ $key ] = ModelDataTranslator::prepareFieldValuesForJson(
96
+					$field_obj,
97
+					$value,
98
+					$request_version
99
+				);
100
+			}
101
+		} else {
102
+			$new_value = ModelDataTranslator::prepareFieldValueForJson(
103
+				$field_obj,
104
+				$original_value_maybe_array,
105
+				$request_version
106
+			);
107
+		}
108
+		return $new_value;
109
+	}
110
+
111
+
112
+	/**
113
+	 * Prepares incoming data from the json or $_REQUEST parameters for the models'
114
+	 * "$query_params".
115
+	 *
116
+	 * @param EE_Model_Field_Base $field_obj
117
+	 * @param mixed               $original_value
118
+	 * @param string              $requested_version
119
+	 * @param string              $timezone_string treat values as being in this timezone
120
+	 * @return mixed
121
+	 * @throws RestException
122
+	 * @throws DomainException
123
+	 * @throws EE_Error
124
+	 */
125
+	public static function prepareFieldValueFromJson(
126
+		$field_obj,
127
+		$original_value,
128
+		$requested_version,
129
+		$timezone_string = 'UTC' // UTC
130
+	) {
131
+		// check if they accidentally submitted an error value. If so throw an exception
132
+		if (is_array($original_value)
133
+			&& isset($original_value['error_code'], $original_value['error_message'])) {
134
+			throw new RestException(
135
+				'rest_submitted_error_value',
136
+				sprintf(
137
+					esc_html__(
138
+						'You tried to submit a JSON error object as a value for %1$s. That\'s not allowed.',
139
+						'event_espresso'
140
+					),
141
+					$field_obj->get_name()
142
+				),
143
+				array(
144
+					'status' => 400,
145
+				)
146
+			);
147
+		}
148
+		// double-check for serialized PHP. We never accept serialized PHP. No way Jose.
149
+		ModelDataTranslator::throwExceptionIfContainsSerializedData($original_value);
150
+		$timezone_string = $timezone_string !== '' ? $timezone_string : get_option('timezone_string', '');
151
+		$new_value = null;
152
+		// walk through the submitted data and double-check for serialized PHP. We never accept serialized PHP. No
153
+		// way Jose.
154
+		ModelDataTranslator::throwExceptionIfContainsSerializedData($original_value);
155
+		if ($field_obj instanceof EE_Infinite_Integer_Field
156
+			&& in_array($original_value, array(null, ''), true)
157
+		) {
158
+			$new_value = EE_INF;
159
+		} elseif ($field_obj instanceof EE_Datetime_Field) {
160
+			$new_value = rest_parse_date(
161
+				self::getTimestampWithTimezoneOffset($original_value, $field_obj, $timezone_string)
162
+			);
163
+			if ($new_value === false) {
164
+				throw new RestException(
165
+					'invalid_format_for_timestamp',
166
+					sprintf(
167
+						esc_html__(
168
+							'Timestamps received on a request as the value for Date and Time fields must be in %1$s/%2$s format.  The timestamp provided (%3$s) is not that format.',
169
+							'event_espresso'
170
+						),
171
+						'RFC3339',
172
+						'ISO8601',
173
+						$original_value
174
+					),
175
+					array(
176
+						'status' => 400,
177
+					)
178
+				);
179
+			}
180
+		} else {
181
+			$new_value = $original_value;
182
+		}
183
+		return $new_value;
184
+	}
185
+
186
+
187
+	/**
188
+	 * This checks if the incoming timestamp has timezone information already on it and if it doesn't then adds timezone
189
+	 * information via details obtained from the host site.
190
+	 *
191
+	 * @param string            $original_timestamp
192
+	 * @param EE_Datetime_Field $datetime_field
193
+	 * @param                   $timezone_string
194
+	 * @return string
195
+	 * @throws DomainException
196
+	 */
197
+	private static function getTimestampWithTimezoneOffset(
198
+		$original_timestamp,
199
+		EE_Datetime_Field $datetime_field,
200
+		$timezone_string
201
+	) {
202
+		// already have timezone information?
203
+		if (preg_match('/Z|(\+|\-)(\d{2}:\d{2})/', $original_timestamp)) {
204
+			// yes, we're ignoring the timezone.
205
+			return $original_timestamp;
206
+		}
207
+		// need to append timezone
208
+		list($offset_sign, $offset_secs) = self::parseTimezoneOffset(
209
+			$datetime_field->get_timezone_offset(
210
+				new \DateTimeZone($timezone_string),
211
+				$original_timestamp
212
+			)
213
+		);
214
+		$offset_string =
215
+			str_pad(
216
+				floor($offset_secs / HOUR_IN_SECONDS),
217
+				2,
218
+				'0',
219
+				STR_PAD_LEFT
220
+			)
221
+			. ':'
222
+			. str_pad(
223
+				($offset_secs % HOUR_IN_SECONDS) / MINUTE_IN_SECONDS,
224
+				2,
225
+				'0',
226
+				STR_PAD_LEFT
227
+			);
228
+		return $original_timestamp . $offset_sign . $offset_string;
229
+	}
230
+
231
+
232
+	/**
233
+	 * Throws an exception if $data is a serialized PHP string (or somehow an actually PHP object, although I don't
234
+	 * think that can happen). If $data is an array, recurses into its keys and values
235
+	 *
236
+	 * @param mixed $data
237
+	 * @throws RestException
238
+	 * @return void
239
+	 */
240
+	public static function throwExceptionIfContainsSerializedData($data)
241
+	{
242
+		if (is_array($data)) {
243
+			foreach ($data as $key => $value) {
244
+				ModelDataTranslator::throwExceptionIfContainsSerializedData($key);
245
+				ModelDataTranslator::throwExceptionIfContainsSerializedData($value);
246
+			}
247
+		} else {
248
+			if (is_serialized($data) || is_object($data)) {
249
+				throw new RestException(
250
+					'serialized_data_submission_prohibited',
251
+					esc_html__(
252
+					// @codingStandardsIgnoreStart
253
+						'You tried to submit a string of serialized text. Serialized PHP is prohibited over the EE4 REST API.',
254
+						// @codingStandardsIgnoreEnd
255
+						'event_espresso'
256
+					)
257
+				);
258
+			}
259
+		}
260
+	}
261
+
262
+
263
+	/**
264
+	 * determines what's going on with them timezone strings
265
+	 *
266
+	 * @param int $timezone_offset
267
+	 * @return array
268
+	 */
269
+	private static function parseTimezoneOffset($timezone_offset)
270
+	{
271
+		$first_char = substr((string) $timezone_offset, 0, 1);
272
+		if ($first_char === '+' || $first_char === '-') {
273
+			$offset_sign = $first_char;
274
+			$offset_secs = substr((string) $timezone_offset, 1);
275
+		} else {
276
+			$offset_sign = '+';
277
+			$offset_secs = $timezone_offset;
278
+		}
279
+		return array($offset_sign, $offset_secs);
280
+	}
281
+
282
+
283
+	/**
284
+	 * Prepares a field's value for display in the API
285
+	 *
286
+	 * @param EE_Model_Field_Base $field_obj
287
+	 * @param mixed               $original_value
288
+	 * @param string              $requested_version
289
+	 * @return mixed
290
+	 */
291
+	public static function prepareFieldValueForJson($field_obj, $original_value, $requested_version)
292
+	{
293
+		if ($original_value === EE_INF) {
294
+			$new_value = ModelDataTranslator::EE_INF_IN_REST;
295
+		} elseif ($field_obj instanceof EE_Datetime_Field) {
296
+			if (is_string($original_value)) {
297
+				// did they submit a string of a unix timestamp?
298
+				if (is_numeric($original_value)) {
299
+					$datetime_obj = new \DateTime();
300
+					$datetime_obj->setTimestamp((int) $original_value);
301
+				} else {
302
+					// first, check if its a MySQL timestamp in GMT
303
+					$datetime_obj = \DateTime::createFromFormat('Y-m-d H:i:s', $original_value);
304
+				}
305
+				if (! $datetime_obj instanceof \DateTime) {
306
+					// so it's not a unix timestamp or a MySQL timestamp. Maybe its in the field's date/time format?
307
+					$datetime_obj = $field_obj->prepare_for_set($original_value);
308
+				}
309
+				$original_value = $datetime_obj;
310
+			}
311
+			if ($original_value instanceof \DateTime) {
312
+				$new_value = $original_value->format('Y-m-d H:i:s');
313
+			} elseif (is_int($original_value) || is_float($original_value)) {
314
+				$new_value = date('Y-m-d H:i:s', $original_value);
315
+			} elseif ($original_value === null || $original_value === '') {
316
+				$new_value = null;
317
+			} else {
318
+				// so it's not a datetime object, unix timestamp (as string or int),
319
+				// MySQL timestamp, or even a string in the field object's format. So no idea what it is
320
+				throw new \EE_Error(
321
+					sprintf(
322
+						esc_html__(
323
+						// @codingStandardsIgnoreStart
324
+							'The value "%1$s" for the field "%2$s" on model "%3$s" could not be understood. It should be a PHP DateTime, unix timestamp, MySQL date, or string in the format "%4$s".',
325
+							// @codingStandardsIgnoreEnd
326
+							'event_espresso'
327
+						),
328
+						$original_value,
329
+						$field_obj->get_name(),
330
+						$field_obj->get_model_name(),
331
+						$field_obj->get_time_format() . ' ' . $field_obj->get_time_format()
332
+					)
333
+				);
334
+			}
335
+			$new_value = mysql_to_rfc3339($new_value);
336
+		} else {
337
+			$new_value = $original_value;
338
+		}
339
+		// are we about to send an object? just don't. We have no good way to represent it in JSON.
340
+		// can't just check using is_object() because that missed PHP incomplete objects
341
+		if (! ModelDataTranslator::isRepresentableInJson($new_value)) {
342
+			$new_value = array(
343
+				'error_code'    => 'php_object_not_return',
344
+				'error_message' => esc_html__(
345
+					'The value of this field in the database is a PHP object, which can\'t be represented in JSON.',
346
+					'event_espresso'
347
+				),
348
+			);
349
+		}
350
+		return apply_filters(
351
+			'FHEE__EventEspresso\core\libraries\rest_api\Model_Data_Translator__prepare_field_for_rest_api',
352
+			$new_value,
353
+			$field_obj,
354
+			$original_value,
355
+			$requested_version
356
+		);
357
+	}
358
+
359
+
360
+	/**
361
+	 * Prepares condition-query-parameters (like what's in where and having) from
362
+	 * the format expected in the API to use in the models
363
+	 *
364
+	 * @param array    $inputted_query_params_of_this_type
365
+	 * @param EEM_Base $model
366
+	 * @param string   $requested_version
367
+	 * @param boolean  $writing whether this data will be written to the DB, or if we're just building a query.
368
+	 *                          If we're writing to the DB, we don't expect any operators, or any logic query
369
+	 *                          parameters, and we also won't accept serialized data unless the current user has
370
+	 *                          unfiltered_html.
371
+	 * @return array
372
+	 * @throws DomainException
373
+	 * @throws RestException
374
+	 * @throws EE_Error
375
+	 */
376
+	public static function prepareConditionsQueryParamsForModels(
377
+		$inputted_query_params_of_this_type,
378
+		EEM_Base $model,
379
+		$requested_version,
380
+		$writing = false
381
+	) {
382
+		$query_param_for_models = array();
383
+		$valid_operators = $model->valid_operators();
384
+		foreach ($inputted_query_params_of_this_type as $query_param_key => $query_param_value) {
385
+			$is_gmt_datetime_field = false;
386
+			$query_param_sans_stars = ModelDataTranslator::removeStarsAndAnythingAfterFromConditionQueryParamKey(
387
+				$query_param_key
388
+			);
389
+			$field = ModelDataTranslator::deduceFieldFromQueryParam(
390
+				$query_param_sans_stars,
391
+				$model
392
+			);
393
+			// double-check is it a *_gmt field?
394
+			if (! $field instanceof EE_Model_Field_Base
395
+				&& ModelDataTranslator::isGmtDateFieldName($query_param_sans_stars)
396
+			) {
397
+				// yep, take off '_gmt', and find the field
398
+				$query_param_key = ModelDataTranslator::removeGmtFromFieldName($query_param_sans_stars);
399
+				$field = ModelDataTranslator::deduceFieldFromQueryParam(
400
+					$query_param_key,
401
+					$model
402
+				);
403
+				$timezone = 'UTC';
404
+				$is_gmt_datetime_field = true;
405
+			} elseif ($field instanceof EE_Datetime_Field) {
406
+				// so it's not a GMT field. Set the timezone on the model to the default
407
+				$timezone = \EEH_DTT_Helper::get_valid_timezone_string();
408
+			} else {
409
+				// just keep using what's already set for the timezone
410
+				$timezone = $model->get_timezone();
411
+			}
412
+			if ($field instanceof EE_Model_Field_Base) {
413
+				if (! $writing && is_array($query_param_value)) {
414
+					if (! \EEH_Array::is_array_numerically_and_sequentially_indexed($query_param_value)) {
415
+						if (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE) {
416
+							throw new RestException(
417
+								'numerically_indexed_array_of_values_only',
418
+								sprintf(
419
+									esc_html__(
420
+										'The array provided for the parameter "%1$s" should be numerically indexed.',
421
+										'event_espresso'
422
+									),
423
+									$query_param_key
424
+								),
425
+								array(
426
+									'status' => 400,
427
+								)
428
+							);
429
+						}
430
+					}
431
+					// did they specify an operator?
432
+					if (isset($query_param_value[0])
433
+						&& isset($valid_operators[ $query_param_value[0] ])
434
+					) {
435
+						$op = $query_param_value[0];
436
+						$translated_value = array($op);
437
+						if (array_key_exists($op, $model->valid_in_style_operators())
438
+							&& isset($query_param_value[1])
439
+							&& ! isset($query_param_value[2])
440
+						) {
441
+							$translated_value[] = ModelDataTranslator::prepareFieldValuesFromJson(
442
+								$field,
443
+								$query_param_value[1],
444
+								$requested_version,
445
+								$timezone
446
+							);
447
+						} elseif (array_key_exists($op, $model->valid_between_style_operators())
448
+								  && isset($query_param_value[1], $query_param_value[2])
449
+								  && ! isset($query_param_value[3])
450
+						) {
451
+							$translated_value[] = ModelDataTranslator::prepareFieldValuesFromJson(
452
+								$field,
453
+								$query_param_value[1],
454
+								$requested_version,
455
+								$timezone
456
+							);
457
+							$translated_value[] = ModelDataTranslator::prepareFieldValuesFromJson(
458
+								$field,
459
+								$query_param_value[2],
460
+								$requested_version,
461
+								$timezone
462
+							);
463
+						} elseif (array_key_exists($op, $model->valid_like_style_operators())
464
+								  && isset($query_param_value[1])
465
+								  && ! isset($query_param_value[2])
466
+						) {
467
+							// we want to leave this value mostly-as-is (eg don't force it to be a float
468
+							// or a boolean or an enum value. Leave it as-is with wildcards etc)
469
+							// but do verify it at least doesn't have any serialized data
470
+							ModelDataTranslator::throwExceptionIfContainsSerializedData($query_param_value[1]);
471
+							$translated_value[] = $query_param_value[1];
472
+						} elseif (array_key_exists($op, $model->valid_null_style_operators())
473
+								  && ! isset($query_param_value[1])) {
474
+							// no arguments should have been provided, so don't look for any
475
+						} elseif (isset($query_param_value[1])
476
+								  && ! isset($query_param_value[2])
477
+								  && ! array_key_exists(
478
+									  $op,
479
+									  array_merge(
480
+										  $model->valid_in_style_operators(),
481
+										  $model->valid_null_style_operators(),
482
+										  $model->valid_like_style_operators(),
483
+										  $model->valid_between_style_operators()
484
+									  )
485
+								  )
486
+						) {
487
+							// it's a valid operator, but none of the exceptions. Treat it normally.
488
+							$translated_value[] = ModelDataTranslator::prepareFieldValuesFromJson(
489
+								$field,
490
+								$query_param_value[1],
491
+								$requested_version,
492
+								$timezone
493
+							);
494
+						} else {
495
+							// so they provided a valid operator, but wrong number of arguments
496
+							if (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE) {
497
+								throw new RestException(
498
+									'wrong_number_of_arguments',
499
+									sprintf(
500
+										esc_html__(
501
+											'The operator you provided, "%1$s" had the wrong number of arguments',
502
+											'event_espresso'
503
+										),
504
+										$op
505
+									),
506
+									array(
507
+										'status' => 400,
508
+									)
509
+								);
510
+							}
511
+							$translated_value = null;
512
+						}
513
+					} else {
514
+						// so they didn't provide a valid operator
515
+						if (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE) {
516
+							throw new RestException(
517
+								'invalid_operator',
518
+								sprintf(
519
+									esc_html__(
520
+										'You provided an invalid parameter, with key "%1$s" and value "%2$s"',
521
+										'event_espresso'
522
+									),
523
+									$query_param_key,
524
+									$query_param_value
525
+								),
526
+								array(
527
+									'status' => 400,
528
+								)
529
+							);
530
+						}
531
+						// if we aren't in debug mode, then just try our best to fulfill the user's request
532
+						$translated_value = null;
533
+					}
534
+				} else {
535
+					$translated_value = ModelDataTranslator::prepareFieldValueFromJson(
536
+						$field,
537
+						$query_param_value,
538
+						$requested_version,
539
+						$timezone
540
+					);
541
+				}
542
+				if ((isset($query_param_for_models[ $query_param_key ]) && $is_gmt_datetime_field)
543
+					|| $translated_value === null
544
+				) {
545
+					// they have already provided a non-gmt field, ignore the gmt one. That's what WP core
546
+					// currently does (they might change it though). See https://core.trac.wordpress.org/ticket/39954
547
+					// OR we couldn't create a translated value from their input
548
+					continue;
549
+				}
550
+				$query_param_for_models[ $query_param_key ] = $translated_value;
551
+			} else {
552
+				// so this param doesn't correspond to a field eh?
553
+				if ($writing) {
554
+					// always tell API clients about invalid parameters when they're creating data. Otherwise,
555
+					// they are probably going to create invalid data
556
+					throw new RestException(
557
+						'invalid_field',
558
+						sprintf(
559
+							esc_html__('You have provided an invalid parameter: "%1$s"', 'event_espresso'),
560
+							$query_param_key
561
+						)
562
+					);
563
+				} else {
564
+					// so it's not for a field, is it a logic query param key?
565
+					if (in_array(
566
+						$query_param_sans_stars,
567
+						$model->logic_query_param_keys()
568
+					)) {
569
+						$query_param_for_models[ $query_param_key ] = ModelDataTranslator::prepareConditionsQueryParamsForModels(
570
+							$query_param_value,
571
+							$model,
572
+							$requested_version
573
+						);
574
+					} elseif (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE) {
575
+						// only tell API clients they got it wrong if we're in debug mode
576
+						// otherwise try our best ot fulfill their request by ignoring this invalid data
577
+						throw new RestException(
578
+							'invalid_parameter',
579
+							sprintf(
580
+								esc_html__(
581
+									'You provided an invalid parameter, with key "%1$s"',
582
+									'event_espresso'
583
+								),
584
+								$query_param_sans_stars
585
+							),
586
+							array(
587
+								'status' => 400,
588
+							)
589
+						);
590
+					}
591
+				}
592
+			}
593
+		}
594
+		return $query_param_for_models;
595
+	}
596
+
597
+
598
+	/**
599
+	 * Mostly checks if the last 4 characters are "_gmt", indicating its a
600
+	 * gmt date field name
601
+	 *
602
+	 * @param string $field_name
603
+	 * @return boolean
604
+	 */
605
+	public static function isGmtDateFieldName($field_name)
606
+	{
607
+		return substr(
608
+			ModelDataTranslator::removeStarsAndAnythingAfterFromConditionQueryParamKey($field_name),
609
+			-4,
610
+			4
611
+		) === '_gmt';
612
+	}
613
+
614
+
615
+	/**
616
+	 * Removes the last "_gmt" part of a field name (and if there is no "_gmt" at the end, leave it alone)
617
+	 *
618
+	 * @param string $field_name
619
+	 * @return string
620
+	 */
621
+	public static function removeGmtFromFieldName($field_name)
622
+	{
623
+		if (! ModelDataTranslator::isGmtDateFieldName($field_name)) {
624
+			return $field_name;
625
+		}
626
+		$query_param_sans_stars = ModelDataTranslator::removeStarsAndAnythingAfterFromConditionQueryParamKey(
627
+			$field_name
628
+		);
629
+		$query_param_sans_gmt_and_sans_stars = substr(
630
+			$query_param_sans_stars,
631
+			0,
632
+			strrpos(
633
+				$field_name,
634
+				'_gmt'
635
+			)
636
+		);
637
+		return str_replace($query_param_sans_stars, $query_param_sans_gmt_and_sans_stars, $field_name);
638
+	}
639
+
640
+
641
+	/**
642
+	 * Takes a field name from the REST API and prepares it for the model querying
643
+	 *
644
+	 * @param string $field_name
645
+	 * @return string
646
+	 */
647
+	public static function prepareFieldNameFromJson($field_name)
648
+	{
649
+		if (ModelDataTranslator::isGmtDateFieldName($field_name)) {
650
+			return ModelDataTranslator::removeGmtFromFieldName($field_name);
651
+		}
652
+		return $field_name;
653
+	}
654
+
655
+
656
+	/**
657
+	 * Takes array of field names from REST API and prepares for models
658
+	 *
659
+	 * @param array $field_names
660
+	 * @return array of field names (possibly include model prefixes)
661
+	 */
662
+	public static function prepareFieldNamesFromJson(array $field_names)
663
+	{
664
+		$new_array = array();
665
+		foreach ($field_names as $key => $field_name) {
666
+			$new_array[ $key ] = ModelDataTranslator::prepareFieldNameFromJson($field_name);
667
+		}
668
+		return $new_array;
669
+	}
670
+
671
+
672
+	/**
673
+	 * Takes array where array keys are field names (possibly with model path prefixes)
674
+	 * from the REST API and prepares them for model querying
675
+	 *
676
+	 * @param array $field_names_as_keys
677
+	 * @return array
678
+	 */
679
+	public static function prepareFieldNamesInArrayKeysFromJson(array $field_names_as_keys)
680
+	{
681
+		$new_array = array();
682
+		foreach ($field_names_as_keys as $field_name => $value) {
683
+			$new_array[ ModelDataTranslator::prepareFieldNameFromJson($field_name) ] = $value;
684
+		}
685
+		return $new_array;
686
+	}
687
+
688
+
689
+	/**
690
+	 * Prepares an array of model query params for use in the REST API
691
+	 *
692
+	 * @param array    $model_query_params
693
+	 * @param EEM_Base $model
694
+	 * @param string   $requested_version  eg "4.8.36". If null is provided, defaults to the latest release of the EE4
695
+	 *                                     REST API
696
+	 * @return array which can be passed into the EE4 REST API when querying a model resource
697
+	 * @throws EE_Error
698
+	 */
699
+	public static function prepareQueryParamsForRestApi(
700
+		array $model_query_params,
701
+		EEM_Base $model,
702
+		$requested_version = null
703
+	) {
704
+		if ($requested_version === null) {
705
+			$requested_version = \EED_Core_Rest_Api::latest_rest_api_version();
706
+		}
707
+		$rest_query_params = $model_query_params;
708
+		if (isset($model_query_params[0])) {
709
+			$rest_query_params['where'] = ModelDataTranslator::prepareConditionsQueryParamsForRestApi(
710
+				$model_query_params[0],
711
+				$model,
712
+				$requested_version
713
+			);
714
+			unset($rest_query_params[0]);
715
+		}
716
+		if (isset($model_query_params['having'])) {
717
+			$rest_query_params['having'] = ModelDataTranslator::prepareConditionsQueryParamsForRestApi(
718
+				$model_query_params['having'],
719
+				$model,
720
+				$requested_version
721
+			);
722
+		}
723
+		return apply_filters(
724
+			'FHEE__EventEspresso\core\libraries\rest_api\Model_Data_Translator__prepare_query_params_for_rest_api',
725
+			$rest_query_params,
726
+			$model_query_params,
727
+			$model,
728
+			$requested_version
729
+		);
730
+	}
731
+
732
+
733
+	/**
734
+	 * Prepares all the sub-conditions query parameters (eg having or where conditions) for use in the rest api
735
+	 *
736
+	 * @param array    $inputted_query_params_of_this_type  eg like the "where" or "having" conditions query params
737
+	 *                                                      passed into EEM_Base::get_all()
738
+	 * @param EEM_Base $model
739
+	 * @param string   $requested_version                   eg "4.8.36"
740
+	 * @return array ready for use in the rest api query params
741
+	 * @throws EE_Error
742
+	 * @throws ObjectDetectedException if somehow a PHP object were in the query params' values,
743
+	 *                                                      (which would be really unusual)
744
+	 */
745
+	public static function prepareConditionsQueryParamsForRestApi(
746
+		$inputted_query_params_of_this_type,
747
+		EEM_Base $model,
748
+		$requested_version
749
+	) {
750
+		$query_param_for_models = array();
751
+		foreach ($inputted_query_params_of_this_type as $query_param_key => $query_param_value) {
752
+			$field = ModelDataTranslator::deduceFieldFromQueryParam(
753
+				ModelDataTranslator::removeStarsAndAnythingAfterFromConditionQueryParamKey($query_param_key),
754
+				$model
755
+			);
756
+			if ($field instanceof EE_Model_Field_Base) {
757
+				// did they specify an operator?
758
+				if (is_array($query_param_value)) {
759
+					$op = $query_param_value[0];
760
+					$translated_value = array($op);
761
+					if (isset($query_param_value[1])) {
762
+						$value = $query_param_value[1];
763
+						$translated_value[1] = ModelDataTranslator::prepareFieldValuesForJson(
764
+							$field,
765
+							$value,
766
+							$requested_version
767
+						);
768
+					}
769
+				} else {
770
+					$translated_value = ModelDataTranslator::prepareFieldValueForJson(
771
+						$field,
772
+						$query_param_value,
773
+						$requested_version
774
+					);
775
+				}
776
+				$query_param_for_models[ $query_param_key ] = $translated_value;
777
+			} else {
778
+				// so it's not for a field, assume it's a logic query param key
779
+				$query_param_for_models[ $query_param_key ] = ModelDataTranslator::prepareConditionsQueryParamsForRestApi(
780
+					$query_param_value,
781
+					$model,
782
+					$requested_version
783
+				);
784
+			}
785
+		}
786
+		return $query_param_for_models;
787
+	}
788
+
789
+
790
+	/**
791
+	 * @param $condition_query_param_key
792
+	 * @return string
793
+	 */
794
+	public static function removeStarsAndAnythingAfterFromConditionQueryParamKey($condition_query_param_key)
795
+	{
796
+		$pos_of_star = strpos($condition_query_param_key, '*');
797
+		if ($pos_of_star === false) {
798
+			return $condition_query_param_key;
799
+		} else {
800
+			$condition_query_param_sans_star = substr($condition_query_param_key, 0, $pos_of_star);
801
+			return $condition_query_param_sans_star;
802
+		}
803
+	}
804
+
805
+
806
+	/**
807
+	 * Takes the input parameter and finds the model field that it indicates.
808
+	 *
809
+	 * @param string   $query_param_name like Registration.Transaction.TXN_ID, Event.Datetime.start_time, or REG_ID
810
+	 * @param EEM_Base $model
811
+	 * @return EE_Model_Field_Base
812
+	 * @throws EE_Error
813
+	 */
814
+	public static function deduceFieldFromQueryParam($query_param_name, EEM_Base $model)
815
+	{
816
+		// ok, now proceed with deducing which part is the model's name, and which is the field's name
817
+		// which will help us find the database table and column
818
+		$query_param_parts = explode('.', $query_param_name);
819
+		if (empty($query_param_parts)) {
820
+			throw new EE_Error(
821
+				sprintf(
822
+					__(
823
+						'_extract_column_name is empty when trying to extract column and table name from %s',
824
+						'event_espresso'
825
+					),
826
+					$query_param_name
827
+				)
828
+			);
829
+		}
830
+		$number_of_parts = count($query_param_parts);
831
+		$last_query_param_part = $query_param_parts[ count($query_param_parts) - 1 ];
832
+		if ($number_of_parts === 1) {
833
+			$field_name = $last_query_param_part;
834
+		} else {// $number_of_parts >= 2
835
+			// the last part is the column name, and there are only 2parts. therefore...
836
+			$field_name = $last_query_param_part;
837
+			$model = \EE_Registry::instance()->load_model($query_param_parts[ $number_of_parts - 2 ]);
838
+		}
839
+		try {
840
+			return $model->field_settings_for($field_name, false);
841
+		} catch (EE_Error $e) {
842
+			return null;
843
+		}
844
+	}
845
+
846
+
847
+	/**
848
+	 * Returns true if $data can be easily represented in JSON.
849
+	 * Basically, objects and resources can't be represented in JSON easily.
850
+	 *
851
+	 * @param mixed $data
852
+	 * @return bool
853
+	 */
854
+	protected static function isRepresentableInJson($data)
855
+	{
856
+		return is_scalar($data)
857
+			   || is_array($data)
858
+			   || is_null($data);
859
+	}
860 860
 }
Please login to merge, or discard this patch.
Spacing   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -60,7 +60,7 @@  discard block
 block discarded – undo
60 60
         ) {
61 61
             $new_value_maybe_array = array();
62 62
             foreach ($original_value_maybe_array as $array_key => $array_item) {
63
-                $new_value_maybe_array[ $array_key ] = ModelDataTranslator::prepareFieldValueFromJson(
63
+                $new_value_maybe_array[$array_key] = ModelDataTranslator::prepareFieldValueFromJson(
64 64
                     $field_obj,
65 65
                     $array_item,
66 66
                     $requested_version,
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
         if (is_array($original_value_maybe_array)) {
93 93
             $new_value = array();
94 94
             foreach ($original_value_maybe_array as $key => $value) {
95
-                $new_value[ $key ] = ModelDataTranslator::prepareFieldValuesForJson(
95
+                $new_value[$key] = ModelDataTranslator::prepareFieldValuesForJson(
96 96
                     $field_obj,
97 97
                     $value,
98 98
                     $request_version
@@ -225,7 +225,7 @@  discard block
 block discarded – undo
225 225
                 '0',
226 226
                 STR_PAD_LEFT
227 227
             );
228
-        return $original_timestamp . $offset_sign . $offset_string;
228
+        return $original_timestamp.$offset_sign.$offset_string;
229 229
     }
230 230
 
231 231
 
@@ -302,7 +302,7 @@  discard block
 block discarded – undo
302 302
                     // first, check if its a MySQL timestamp in GMT
303 303
                     $datetime_obj = \DateTime::createFromFormat('Y-m-d H:i:s', $original_value);
304 304
                 }
305
-                if (! $datetime_obj instanceof \DateTime) {
305
+                if ( ! $datetime_obj instanceof \DateTime) {
306 306
                     // so it's not a unix timestamp or a MySQL timestamp. Maybe its in the field's date/time format?
307 307
                     $datetime_obj = $field_obj->prepare_for_set($original_value);
308 308
                 }
@@ -328,7 +328,7 @@  discard block
 block discarded – undo
328 328
                         $original_value,
329 329
                         $field_obj->get_name(),
330 330
                         $field_obj->get_model_name(),
331
-                        $field_obj->get_time_format() . ' ' . $field_obj->get_time_format()
331
+                        $field_obj->get_time_format().' '.$field_obj->get_time_format()
332 332
                     )
333 333
                 );
334 334
             }
@@ -338,7 +338,7 @@  discard block
 block discarded – undo
338 338
         }
339 339
         // are we about to send an object? just don't. We have no good way to represent it in JSON.
340 340
         // can't just check using is_object() because that missed PHP incomplete objects
341
-        if (! ModelDataTranslator::isRepresentableInJson($new_value)) {
341
+        if ( ! ModelDataTranslator::isRepresentableInJson($new_value)) {
342 342
             $new_value = array(
343 343
                 'error_code'    => 'php_object_not_return',
344 344
                 'error_message' => esc_html__(
@@ -391,7 +391,7 @@  discard block
 block discarded – undo
391 391
                 $model
392 392
             );
393 393
             // double-check is it a *_gmt field?
394
-            if (! $field instanceof EE_Model_Field_Base
394
+            if ( ! $field instanceof EE_Model_Field_Base
395 395
                 && ModelDataTranslator::isGmtDateFieldName($query_param_sans_stars)
396 396
             ) {
397 397
                 // yep, take off '_gmt', and find the field
@@ -410,8 +410,8 @@  discard block
 block discarded – undo
410 410
                 $timezone = $model->get_timezone();
411 411
             }
412 412
             if ($field instanceof EE_Model_Field_Base) {
413
-                if (! $writing && is_array($query_param_value)) {
414
-                    if (! \EEH_Array::is_array_numerically_and_sequentially_indexed($query_param_value)) {
413
+                if ( ! $writing && is_array($query_param_value)) {
414
+                    if ( ! \EEH_Array::is_array_numerically_and_sequentially_indexed($query_param_value)) {
415 415
                         if (defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE) {
416 416
                             throw new RestException(
417 417
                                 'numerically_indexed_array_of_values_only',
@@ -430,7 +430,7 @@  discard block
 block discarded – undo
430 430
                     }
431 431
                     // did they specify an operator?
432 432
                     if (isset($query_param_value[0])
433
-                        && isset($valid_operators[ $query_param_value[0] ])
433
+                        && isset($valid_operators[$query_param_value[0]])
434 434
                     ) {
435 435
                         $op = $query_param_value[0];
436 436
                         $translated_value = array($op);
@@ -539,7 +539,7 @@  discard block
 block discarded – undo
539 539
                         $timezone
540 540
                     );
541 541
                 }
542
-                if ((isset($query_param_for_models[ $query_param_key ]) && $is_gmt_datetime_field)
542
+                if ((isset($query_param_for_models[$query_param_key]) && $is_gmt_datetime_field)
543 543
                     || $translated_value === null
544 544
                 ) {
545 545
                     // they have already provided a non-gmt field, ignore the gmt one. That's what WP core
@@ -547,7 +547,7 @@  discard block
 block discarded – undo
547 547
                     // OR we couldn't create a translated value from their input
548 548
                     continue;
549 549
                 }
550
-                $query_param_for_models[ $query_param_key ] = $translated_value;
550
+                $query_param_for_models[$query_param_key] = $translated_value;
551 551
             } else {
552 552
                 // so this param doesn't correspond to a field eh?
553 553
                 if ($writing) {
@@ -566,7 +566,7 @@  discard block
 block discarded – undo
566 566
                         $query_param_sans_stars,
567 567
                         $model->logic_query_param_keys()
568 568
                     )) {
569
-                        $query_param_for_models[ $query_param_key ] = ModelDataTranslator::prepareConditionsQueryParamsForModels(
569
+                        $query_param_for_models[$query_param_key] = ModelDataTranslator::prepareConditionsQueryParamsForModels(
570 570
                             $query_param_value,
571 571
                             $model,
572 572
                             $requested_version
@@ -620,7 +620,7 @@  discard block
 block discarded – undo
620 620
      */
621 621
     public static function removeGmtFromFieldName($field_name)
622 622
     {
623
-        if (! ModelDataTranslator::isGmtDateFieldName($field_name)) {
623
+        if ( ! ModelDataTranslator::isGmtDateFieldName($field_name)) {
624 624
             return $field_name;
625 625
         }
626 626
         $query_param_sans_stars = ModelDataTranslator::removeStarsAndAnythingAfterFromConditionQueryParamKey(
@@ -663,7 +663,7 @@  discard block
 block discarded – undo
663 663
     {
664 664
         $new_array = array();
665 665
         foreach ($field_names as $key => $field_name) {
666
-            $new_array[ $key ] = ModelDataTranslator::prepareFieldNameFromJson($field_name);
666
+            $new_array[$key] = ModelDataTranslator::prepareFieldNameFromJson($field_name);
667 667
         }
668 668
         return $new_array;
669 669
     }
@@ -680,7 +680,7 @@  discard block
 block discarded – undo
680 680
     {
681 681
         $new_array = array();
682 682
         foreach ($field_names_as_keys as $field_name => $value) {
683
-            $new_array[ ModelDataTranslator::prepareFieldNameFromJson($field_name) ] = $value;
683
+            $new_array[ModelDataTranslator::prepareFieldNameFromJson($field_name)] = $value;
684 684
         }
685 685
         return $new_array;
686 686
     }
@@ -773,10 +773,10 @@  discard block
 block discarded – undo
773 773
                         $requested_version
774 774
                     );
775 775
                 }
776
-                $query_param_for_models[ $query_param_key ] = $translated_value;
776
+                $query_param_for_models[$query_param_key] = $translated_value;
777 777
             } else {
778 778
                 // so it's not for a field, assume it's a logic query param key
779
-                $query_param_for_models[ $query_param_key ] = ModelDataTranslator::prepareConditionsQueryParamsForRestApi(
779
+                $query_param_for_models[$query_param_key] = ModelDataTranslator::prepareConditionsQueryParamsForRestApi(
780 780
                     $query_param_value,
781 781
                     $model,
782 782
                     $requested_version
@@ -828,13 +828,13 @@  discard block
 block discarded – undo
828 828
             );
829 829
         }
830 830
         $number_of_parts = count($query_param_parts);
831
-        $last_query_param_part = $query_param_parts[ count($query_param_parts) - 1 ];
831
+        $last_query_param_part = $query_param_parts[count($query_param_parts) - 1];
832 832
         if ($number_of_parts === 1) {
833 833
             $field_name = $last_query_param_part;
834 834
         } else {// $number_of_parts >= 2
835 835
             // the last part is the column name, and there are only 2parts. therefore...
836 836
             $field_name = $last_query_param_part;
837
-            $model = \EE_Registry::instance()->load_model($query_param_parts[ $number_of_parts - 2 ]);
837
+            $model = \EE_Registry::instance()->load_model($query_param_parts[$number_of_parts - 2]);
838 838
         }
839 839
         try {
840 840
             return $model->field_settings_for($field_name, false);
Please login to merge, or discard this patch.
core/libraries/rest_api/ModelVersionInfo.php 2 patches
Indentation   +436 added lines, -436 removed lines patch added patch discarded remove patch
@@ -21,440 +21,440 @@
 block discarded – undo
21 21
 class ModelVersionInfo
22 22
 {
23 23
 
24
-    /**
25
-     * Constant used in the $_model_changes array to indicate that a model
26
-     * was completely new in this version
27
-     */
28
-    const MODEL_ADDED = 'model_added_in_this_version';
29
-
30
-    /**
31
-     * Top-level keys are versions (major and minor version numbers, eg "4.6")
32
-     * next-level keys are model names (eg "Event") that underwent some change in that version
33
-     * and the value is either Model_Version_Info::model_added (indicating the model is completely NEW in this version),
34
-     * or it's an array where the values are model field names,
35
-     * or API resource properties (ie, non-model fields that appear in REST API results)
36
-     * If a version is missing then we don't know anything about what changes it introduced from the previous version
37
-     *
38
-     * @var array
39
-     */
40
-    protected $model_changes = array();
41
-
42
-    /**
43
-     * top-level keys are version numbers,
44
-     * next-level keys are model CLASSNAMES (even parent classnames),
45
-     * and next-level keys are extra resource properties to attach to those models' resources,
46
-     * and next-level key-value pairs, where the keys are:
47
-     * 'raw', 'type', 'nullable', 'table_alias', 'table_column',  'always_available'
48
-     *
49
-     * @var array
50
-     */
51
-    protected $resource_changes = array();
52
-
53
-    /**
54
-     * @var string indicating what version of the API was requested
55
-     * (eg although core might be at version 4.8.11, they may have sent a request
56
-     * for 4.6)
57
-     */
58
-    protected $requested_version = null;
59
-
60
-    /**
61
-     * Keys are model names, values are their classnames.
62
-     * We cache this so we only need to calculate this once per request
63
-     *
64
-     * @var array
65
-     */
66
-    protected $cached_models_for_requested_version = null;
67
-
68
-    /**
69
-     * @var array
70
-     */
71
-    protected $cached_model_changes_between_requested_version_and_current = null;
72
-
73
-    /**
74
-     * @var array
75
-     */
76
-    protected $cached_resource_changes_between_requested_version_and_current = null;
77
-
78
-    /**
79
-     * 2d array where top-level keys are model names, 2nd-level keys are field names
80
-     * and values are the actual field objects
81
-     *
82
-     * @var array
83
-     */
84
-    protected $cached_fields_on_models = array();
85
-
86
-
87
-    /**
88
-     * Model_Version_Info constructor.
89
-     *
90
-     * @param string $requested_version
91
-     */
92
-    public function __construct($requested_version)
93
-    {
94
-        $this->requested_version = (string) $requested_version;
95
-        $this->model_changes = array(
96
-            '4.8.29' => array(
97
-                // first version where the REST API is in EE core, so no need
98
-                // to specify how its different from the previous
99
-            ),
100
-        );
101
-        // setup data for "extra" fields added onto resources which don't actually exist on models
102
-        $this->resource_changes = apply_filters(
103
-            'FHEE__Model_Version_Info___construct__extra_resource_properties_for_models',
104
-            array()
105
-        );
106
-        $defaults = array(
107
-            'raw'              => false,
108
-            'type'             => 'N/A',
109
-            'nullable'         => true,
110
-            'table_alias'      => 'N/A',
111
-            'table_column'     => 'N/A',
112
-            'always_available' => true,
113
-        );
114
-        foreach ($this->resource_changes as $version => $model_classnames) {
115
-            foreach ($model_classnames as $model_classname => $extra_fields) {
116
-                foreach ($extra_fields as $fieldname => $field_data) {
117
-                    $this->resource_changes[ $model_classname ][ $fieldname ]['name'] = $fieldname;
118
-                    foreach ($defaults as $attribute => $default_value) {
119
-                        if (! isset($this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ])) {
120
-                            $this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ] = $default_value;
121
-                        }
122
-                    }
123
-                }
124
-            }
125
-        }
126
-    }
127
-
128
-
129
-    /**
130
-     * Returns a slice of Model_Version_Info::model_changes()'s array
131
-     * indicating exactly what changes happened between the current core version,
132
-     * and the version requested
133
-     *
134
-     * @return array
135
-     */
136
-    public function modelChangesBetweenRequestedVersionAndCurrent()
137
-    {
138
-        if ($this->cached_model_changes_between_requested_version_and_current === null) {
139
-            $model_changes = array();
140
-            foreach ($this->modelChanges() as $version => $models_changed_in_version) {
141
-                if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
142
-                    $model_changes[ $version ] = $models_changed_in_version;
143
-                }
144
-            }
145
-            $this->cached_model_changes_between_requested_version_and_current = $model_changes;
146
-        }
147
-        return $this->cached_model_changes_between_requested_version_and_current;
148
-    }
149
-
150
-
151
-    /**
152
-     * Returns a slice of Model_Version_Info::model_changes()'s array
153
-     * indicating exactly what changes happened between the current core version,
154
-     * and the version requested
155
-     *
156
-     * @return array
157
-     */
158
-    public function resourceChangesBetweenRequestedVersionAndCurrent()
159
-    {
160
-        if ($this->cached_resource_changes_between_requested_version_and_current === null) {
161
-            $resource_changes = array();
162
-            foreach ($this->resourceChanges() as $version => $model_classnames) {
163
-                if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
164
-                    $resource_changes[ $version ] = $model_classnames;
165
-                }
166
-            }
167
-            $this->cached_resource_changes_between_requested_version_and_current = $resource_changes;
168
-        }
169
-        return $this->cached_resource_changes_between_requested_version_and_current;
170
-    }
171
-
172
-
173
-    /**
174
-     * If a request was sent to 'wp-json/ee/v4.7/events' this would be '4.7'
175
-     *
176
-     * @return string like '4.6'
177
-     */
178
-    public function requestedVersion()
179
-    {
180
-        return $this->requested_version;
181
-    }
182
-
183
-
184
-    /**
185
-     * Returns an array describing how the models have changed in each version of core
186
-     * that supports the API (starting at 4.6)
187
-     * Top-level keys are versions (major and minor version numbers, eg "4.6")
188
-     * next-level keys are model names (eg "Event") that underwent some change in that version
189
-     * and the value is either NULL (indicating the model is completely NEW in this version),
190
-     * or it's an array where fields are value names.
191
-     * If a version is missing then we don't know anything about what changes it introduced from the previous version
192
-     *
193
-     * @return array
194
-     */
195
-    public function modelChanges()
196
-    {
197
-        return $this->model_changes;
198
-    }
199
-
200
-
201
-    /**
202
-     * Takes into account the requested version, and the current version, and
203
-     * what changed between the two, and tries to return.
204
-     * Analogous to EE_Registry::instance()->non_abstract_db_models
205
-     *
206
-     * @return array keys are model names, values are their classname
207
-     */
208
-    public function modelsForRequestedVersion()
209
-    {
210
-        if ($this->cached_models_for_requested_version === null) {
211
-            $all_models_in_current_version = EE_Registry::instance()->non_abstract_db_models;
212
-            foreach ($this->modelChangesBetweenRequestedVersionAndCurrent() as $version => $models_changed) {
213
-                foreach ($models_changed as $model_name => $new_indicator_or_fields_added) {
214
-                    if ($new_indicator_or_fields_added === ModelVersionInfo::MODEL_ADDED) {
215
-                        unset($all_models_in_current_version[ $model_name ]);
216
-                    }
217
-                }
218
-            }
219
-            $this->cached_models_for_requested_version = apply_filters(
220
-                'FHEE__EventEspresso_core_libraries_rest_api__models_for_requested_version',
221
-                $all_models_in_current_version,
222
-                $this
223
-            );
224
-        }
225
-        return $this->cached_models_for_requested_version;
226
-    }
227
-
228
-
229
-    /**
230
-     * Determines if this is a valid model name in the requested version.
231
-     * Similar to EE_Registry::instance()->is_model_name(), but takes the requested
232
-     * version's models into account
233
-     *
234
-     * @param string $model_name eg 'Event'
235
-     * @return boolean
236
-     */
237
-    public function isModelNameInThisVersion($model_name)
238
-    {
239
-        $model_names = $this->modelsForRequestedVersion();
240
-        if (isset($model_names[ $model_name ])) {
241
-            return true;
242
-        } else {
243
-            return false;
244
-        }
245
-    }
246
-
247
-
248
-    /**
249
-     * Wrapper for EE_Registry::instance()->load_model(), but takes the requested
250
-     * version's models into account
251
-     *
252
-     * @param string $model_name
253
-     * @return \EEM_Base
254
-     * @throws \EE_Error
255
-     */
256
-    public function loadModel($model_name)
257
-    {
258
-        if ($this->isModelNameInThisVersion($model_name)) {
259
-            return EE_Registry::instance()->load_model($model_name);
260
-        } else {
261
-            throw new \EE_Error(
262
-                sprintf(
263
-                    __(
264
-                        'Cannot load model "%1$s" because it does not exist in version %2$s of Event Espresso',
265
-                        'event_espresso'
266
-                    ),
267
-                    $model_name,
268
-                    $this->requestedVersion()
269
-                )
270
-            );
271
-        }
272
-    }
273
-
274
-
275
-    /**
276
-     * Gets all the fields that should exist on this model right now
277
-     *
278
-     * @param \EEM_Base $model
279
-     * @return array|\EE_Model_Field_Base[]
280
-     */
281
-    public function fieldsOnModelInThisVersion($model)
282
-    {
283
-        if (! isset($this->cached_fields_on_models[ $model->get_this_model_name() ])) {
284
-            // get all model changes between the requested version and current core version
285
-            $changes = $this->modelChangesBetweenRequestedVersionAndCurrent();
286
-            // fetch all fields currently on this model
287
-            $current_fields = $model->field_settings();
288
-            // remove all fields that have been added since
289
-            foreach ($changes as $version => $changes_in_version) {
290
-                if (isset($changes_in_version[ $model->get_this_model_name() ])
291
-                    && $changes_in_version[ $model->get_this_model_name() ] !== ModelVersionInfo::MODEL_ADDED
292
-                ) {
293
-                    $current_fields = array_diff_key(
294
-                        $current_fields,
295
-                        array_flip($changes_in_version[ $model->get_this_model_name() ])
296
-                    );
297
-                }
298
-            }
299
-            $this->cached_fields_on_models = $current_fields;
300
-        }
301
-        return $this->cached_fields_on_models;
302
-    }
303
-
304
-
305
-    /**
306
-     * Determines if $object is of one of the classes of $classes. Similar to
307
-     * in_array(), except this checks if $object is a subclass of the classnames provided
308
-     * in $classnames
309
-     *
310
-     * @param object $object
311
-     * @param array  $classnames
312
-     * @return boolean
313
-     */
314
-    public function isSubclassOfOne($object, $classnames)
315
-    {
316
-        foreach ($classnames as $classname) {
317
-            if (is_a($object, $classname)) {
318
-                return true;
319
-            }
320
-        }
321
-        return false;
322
-    }
323
-
324
-
325
-    /**
326
-     * Returns the list of model field classes that that the API basically ignores
327
-     *
328
-     * @return array
329
-     */
330
-    public function fieldsIgnored()
331
-    {
332
-        return apply_filters(
333
-            'FHEE__Controller_Model_Read_fields_ignored',
334
-            array('EE_Foreign_Key_Field_Base', 'EE_Any_Foreign_Model_Name_Field')
335
-        );
336
-    }
337
-
338
-
339
-    /**
340
-     * If this field one that should be ignored by the API?
341
-     *
342
-     * @param EE_Model_Field_Base
343
-     * @return boolean
344
-     */
345
-    public function fieldIsIgnored($field_obj)
346
-    {
347
-        return $this->isSubclassOfOne($field_obj, $this->fieldsIgnored());
348
-    }
349
-
350
-
351
-    /**
352
-     * Returns the list of model field classes that have a "raw" and non-raw formats.
353
-     * Normally the "raw" versions are only accessible to those who can edit them.
354
-     *
355
-     * @return array an array of EE_Model_Field_Base child classnames
356
-     */
357
-    public function fieldsThatHaveRenderedFormat()
358
-    {
359
-        return apply_filters(
360
-            'FHEE__Controller_Model_Read__fields_raw',
361
-            array('EE_Post_Content_Field', 'EE_Full_HTML_Field')
362
-        );
363
-    }
364
-
365
-
366
-    /**
367
-     * If this field one that has a raw format
368
-     *
369
-     * @param EE_Model_Field_Base
370
-     * @return boolean
371
-     */
372
-    public function fieldHasRenderedFormat($field_obj)
373
-    {
374
-        return $this->isSubclassOfOne($field_obj, $this->fieldsThatHaveRenderedFormat());
375
-    }
376
-
377
-
378
-    /**
379
-     * Returns the list of model field classes that have a "_pretty" and non-pretty versions.
380
-     * The pretty version of the field is NOT query-able or editable, but requires no extra permissions
381
-     * to view
382
-     *
383
-     * @return array an array of EE_Model_Field_Base child classnames
384
-     */
385
-    public function fieldsThatHavePrettyFormat()
386
-    {
387
-        return apply_filters(
388
-            'FHEE__Controller_Model_Read__fields_pretty',
389
-            array('EE_Enum_Integer_Field', 'EE_Enum_Text_Field', 'EE_Money_Field')
390
-        );
391
-    }
392
-
393
-
394
-    /**
395
-     * If this field one that has a pretty equivalent
396
-     *
397
-     * @param EE_Model_Field_Base
398
-     * @return boolean
399
-     */
400
-    public function fieldHasPrettyFormat($field_obj)
401
-    {
402
-        return $this->isSubclassOfOne($field_obj, $this->fieldsThatHavePrettyFormat());
403
-    }
404
-
405
-
406
-    /**
407
-     * Returns an array describing what extra API resource properties have been added through the versions
408
-     *
409
-     * @return array @see $this->_extra_resource_properties_for_models
410
-     */
411
-    public function resourceChanges()
412
-    {
413
-        return $this->resource_changes;
414
-    }
415
-
416
-
417
-    /**
418
-     * Returns an array where keys are extra resource properties in this version of the API,
419
-     * and values are key-value pairs describing the new properties. @see Model_Version::_resource_changes
420
-     *
421
-     * @param \EEM_Base $model
422
-     * @return array
423
-     */
424
-    public function extraResourcePropertiesForModel($model)
425
-    {
426
-        $extra_properties = array();
427
-        foreach ($this->resourceChangesBetweenRequestedVersionAndCurrent() as $version => $model_classnames) {
428
-            foreach ($model_classnames as $model_classname => $properties_added_in_this_version) {
429
-                if (is_subclass_of($model, $model_classname)) {
430
-                    $extra_properties = array_merge($extra_properties, $properties_added_in_this_version);
431
-                }
432
-            }
433
-        }
434
-        return $extra_properties;
435
-    }
436
-
437
-
438
-    /**
439
-     * Gets all the related models for the specified model. It's good to use this
440
-     * in case this model didn't exist for this version or something
441
-     *
442
-     * @param \EEM_Base $model
443
-     * @return \EE_Model_Relation_Base[]
444
-     */
445
-    public function relationSettings(\EEM_Base $model)
446
-    {
447
-        $relations = array();
448
-        foreach ($model->relation_settings() as $relation_name => $relation_obj) {
449
-            if ($this->isModelNameInThisVersion($relation_name)) {
450
-                $relations[ $relation_name ] = $relation_obj;
451
-            }
452
-        }
453
-        // filter the results, but use the old filter name
454
-        return apply_filters(
455
-            'FHEE__Read__create_entity_from_wpdb_result__related_models_to_include',
456
-            $relations,
457
-            $model
458
-        );
459
-    }
24
+	/**
25
+	 * Constant used in the $_model_changes array to indicate that a model
26
+	 * was completely new in this version
27
+	 */
28
+	const MODEL_ADDED = 'model_added_in_this_version';
29
+
30
+	/**
31
+	 * Top-level keys are versions (major and minor version numbers, eg "4.6")
32
+	 * next-level keys are model names (eg "Event") that underwent some change in that version
33
+	 * and the value is either Model_Version_Info::model_added (indicating the model is completely NEW in this version),
34
+	 * or it's an array where the values are model field names,
35
+	 * or API resource properties (ie, non-model fields that appear in REST API results)
36
+	 * If a version is missing then we don't know anything about what changes it introduced from the previous version
37
+	 *
38
+	 * @var array
39
+	 */
40
+	protected $model_changes = array();
41
+
42
+	/**
43
+	 * top-level keys are version numbers,
44
+	 * next-level keys are model CLASSNAMES (even parent classnames),
45
+	 * and next-level keys are extra resource properties to attach to those models' resources,
46
+	 * and next-level key-value pairs, where the keys are:
47
+	 * 'raw', 'type', 'nullable', 'table_alias', 'table_column',  'always_available'
48
+	 *
49
+	 * @var array
50
+	 */
51
+	protected $resource_changes = array();
52
+
53
+	/**
54
+	 * @var string indicating what version of the API was requested
55
+	 * (eg although core might be at version 4.8.11, they may have sent a request
56
+	 * for 4.6)
57
+	 */
58
+	protected $requested_version = null;
59
+
60
+	/**
61
+	 * Keys are model names, values are their classnames.
62
+	 * We cache this so we only need to calculate this once per request
63
+	 *
64
+	 * @var array
65
+	 */
66
+	protected $cached_models_for_requested_version = null;
67
+
68
+	/**
69
+	 * @var array
70
+	 */
71
+	protected $cached_model_changes_between_requested_version_and_current = null;
72
+
73
+	/**
74
+	 * @var array
75
+	 */
76
+	protected $cached_resource_changes_between_requested_version_and_current = null;
77
+
78
+	/**
79
+	 * 2d array where top-level keys are model names, 2nd-level keys are field names
80
+	 * and values are the actual field objects
81
+	 *
82
+	 * @var array
83
+	 */
84
+	protected $cached_fields_on_models = array();
85
+
86
+
87
+	/**
88
+	 * Model_Version_Info constructor.
89
+	 *
90
+	 * @param string $requested_version
91
+	 */
92
+	public function __construct($requested_version)
93
+	{
94
+		$this->requested_version = (string) $requested_version;
95
+		$this->model_changes = array(
96
+			'4.8.29' => array(
97
+				// first version where the REST API is in EE core, so no need
98
+				// to specify how its different from the previous
99
+			),
100
+		);
101
+		// setup data for "extra" fields added onto resources which don't actually exist on models
102
+		$this->resource_changes = apply_filters(
103
+			'FHEE__Model_Version_Info___construct__extra_resource_properties_for_models',
104
+			array()
105
+		);
106
+		$defaults = array(
107
+			'raw'              => false,
108
+			'type'             => 'N/A',
109
+			'nullable'         => true,
110
+			'table_alias'      => 'N/A',
111
+			'table_column'     => 'N/A',
112
+			'always_available' => true,
113
+		);
114
+		foreach ($this->resource_changes as $version => $model_classnames) {
115
+			foreach ($model_classnames as $model_classname => $extra_fields) {
116
+				foreach ($extra_fields as $fieldname => $field_data) {
117
+					$this->resource_changes[ $model_classname ][ $fieldname ]['name'] = $fieldname;
118
+					foreach ($defaults as $attribute => $default_value) {
119
+						if (! isset($this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ])) {
120
+							$this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ] = $default_value;
121
+						}
122
+					}
123
+				}
124
+			}
125
+		}
126
+	}
127
+
128
+
129
+	/**
130
+	 * Returns a slice of Model_Version_Info::model_changes()'s array
131
+	 * indicating exactly what changes happened between the current core version,
132
+	 * and the version requested
133
+	 *
134
+	 * @return array
135
+	 */
136
+	public function modelChangesBetweenRequestedVersionAndCurrent()
137
+	{
138
+		if ($this->cached_model_changes_between_requested_version_and_current === null) {
139
+			$model_changes = array();
140
+			foreach ($this->modelChanges() as $version => $models_changed_in_version) {
141
+				if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
142
+					$model_changes[ $version ] = $models_changed_in_version;
143
+				}
144
+			}
145
+			$this->cached_model_changes_between_requested_version_and_current = $model_changes;
146
+		}
147
+		return $this->cached_model_changes_between_requested_version_and_current;
148
+	}
149
+
150
+
151
+	/**
152
+	 * Returns a slice of Model_Version_Info::model_changes()'s array
153
+	 * indicating exactly what changes happened between the current core version,
154
+	 * and the version requested
155
+	 *
156
+	 * @return array
157
+	 */
158
+	public function resourceChangesBetweenRequestedVersionAndCurrent()
159
+	{
160
+		if ($this->cached_resource_changes_between_requested_version_and_current === null) {
161
+			$resource_changes = array();
162
+			foreach ($this->resourceChanges() as $version => $model_classnames) {
163
+				if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
164
+					$resource_changes[ $version ] = $model_classnames;
165
+				}
166
+			}
167
+			$this->cached_resource_changes_between_requested_version_and_current = $resource_changes;
168
+		}
169
+		return $this->cached_resource_changes_between_requested_version_and_current;
170
+	}
171
+
172
+
173
+	/**
174
+	 * If a request was sent to 'wp-json/ee/v4.7/events' this would be '4.7'
175
+	 *
176
+	 * @return string like '4.6'
177
+	 */
178
+	public function requestedVersion()
179
+	{
180
+		return $this->requested_version;
181
+	}
182
+
183
+
184
+	/**
185
+	 * Returns an array describing how the models have changed in each version of core
186
+	 * that supports the API (starting at 4.6)
187
+	 * Top-level keys are versions (major and minor version numbers, eg "4.6")
188
+	 * next-level keys are model names (eg "Event") that underwent some change in that version
189
+	 * and the value is either NULL (indicating the model is completely NEW in this version),
190
+	 * or it's an array where fields are value names.
191
+	 * If a version is missing then we don't know anything about what changes it introduced from the previous version
192
+	 *
193
+	 * @return array
194
+	 */
195
+	public function modelChanges()
196
+	{
197
+		return $this->model_changes;
198
+	}
199
+
200
+
201
+	/**
202
+	 * Takes into account the requested version, and the current version, and
203
+	 * what changed between the two, and tries to return.
204
+	 * Analogous to EE_Registry::instance()->non_abstract_db_models
205
+	 *
206
+	 * @return array keys are model names, values are their classname
207
+	 */
208
+	public function modelsForRequestedVersion()
209
+	{
210
+		if ($this->cached_models_for_requested_version === null) {
211
+			$all_models_in_current_version = EE_Registry::instance()->non_abstract_db_models;
212
+			foreach ($this->modelChangesBetweenRequestedVersionAndCurrent() as $version => $models_changed) {
213
+				foreach ($models_changed as $model_name => $new_indicator_or_fields_added) {
214
+					if ($new_indicator_or_fields_added === ModelVersionInfo::MODEL_ADDED) {
215
+						unset($all_models_in_current_version[ $model_name ]);
216
+					}
217
+				}
218
+			}
219
+			$this->cached_models_for_requested_version = apply_filters(
220
+				'FHEE__EventEspresso_core_libraries_rest_api__models_for_requested_version',
221
+				$all_models_in_current_version,
222
+				$this
223
+			);
224
+		}
225
+		return $this->cached_models_for_requested_version;
226
+	}
227
+
228
+
229
+	/**
230
+	 * Determines if this is a valid model name in the requested version.
231
+	 * Similar to EE_Registry::instance()->is_model_name(), but takes the requested
232
+	 * version's models into account
233
+	 *
234
+	 * @param string $model_name eg 'Event'
235
+	 * @return boolean
236
+	 */
237
+	public function isModelNameInThisVersion($model_name)
238
+	{
239
+		$model_names = $this->modelsForRequestedVersion();
240
+		if (isset($model_names[ $model_name ])) {
241
+			return true;
242
+		} else {
243
+			return false;
244
+		}
245
+	}
246
+
247
+
248
+	/**
249
+	 * Wrapper for EE_Registry::instance()->load_model(), but takes the requested
250
+	 * version's models into account
251
+	 *
252
+	 * @param string $model_name
253
+	 * @return \EEM_Base
254
+	 * @throws \EE_Error
255
+	 */
256
+	public function loadModel($model_name)
257
+	{
258
+		if ($this->isModelNameInThisVersion($model_name)) {
259
+			return EE_Registry::instance()->load_model($model_name);
260
+		} else {
261
+			throw new \EE_Error(
262
+				sprintf(
263
+					__(
264
+						'Cannot load model "%1$s" because it does not exist in version %2$s of Event Espresso',
265
+						'event_espresso'
266
+					),
267
+					$model_name,
268
+					$this->requestedVersion()
269
+				)
270
+			);
271
+		}
272
+	}
273
+
274
+
275
+	/**
276
+	 * Gets all the fields that should exist on this model right now
277
+	 *
278
+	 * @param \EEM_Base $model
279
+	 * @return array|\EE_Model_Field_Base[]
280
+	 */
281
+	public function fieldsOnModelInThisVersion($model)
282
+	{
283
+		if (! isset($this->cached_fields_on_models[ $model->get_this_model_name() ])) {
284
+			// get all model changes between the requested version and current core version
285
+			$changes = $this->modelChangesBetweenRequestedVersionAndCurrent();
286
+			// fetch all fields currently on this model
287
+			$current_fields = $model->field_settings();
288
+			// remove all fields that have been added since
289
+			foreach ($changes as $version => $changes_in_version) {
290
+				if (isset($changes_in_version[ $model->get_this_model_name() ])
291
+					&& $changes_in_version[ $model->get_this_model_name() ] !== ModelVersionInfo::MODEL_ADDED
292
+				) {
293
+					$current_fields = array_diff_key(
294
+						$current_fields,
295
+						array_flip($changes_in_version[ $model->get_this_model_name() ])
296
+					);
297
+				}
298
+			}
299
+			$this->cached_fields_on_models = $current_fields;
300
+		}
301
+		return $this->cached_fields_on_models;
302
+	}
303
+
304
+
305
+	/**
306
+	 * Determines if $object is of one of the classes of $classes. Similar to
307
+	 * in_array(), except this checks if $object is a subclass of the classnames provided
308
+	 * in $classnames
309
+	 *
310
+	 * @param object $object
311
+	 * @param array  $classnames
312
+	 * @return boolean
313
+	 */
314
+	public function isSubclassOfOne($object, $classnames)
315
+	{
316
+		foreach ($classnames as $classname) {
317
+			if (is_a($object, $classname)) {
318
+				return true;
319
+			}
320
+		}
321
+		return false;
322
+	}
323
+
324
+
325
+	/**
326
+	 * Returns the list of model field classes that that the API basically ignores
327
+	 *
328
+	 * @return array
329
+	 */
330
+	public function fieldsIgnored()
331
+	{
332
+		return apply_filters(
333
+			'FHEE__Controller_Model_Read_fields_ignored',
334
+			array('EE_Foreign_Key_Field_Base', 'EE_Any_Foreign_Model_Name_Field')
335
+		);
336
+	}
337
+
338
+
339
+	/**
340
+	 * If this field one that should be ignored by the API?
341
+	 *
342
+	 * @param EE_Model_Field_Base
343
+	 * @return boolean
344
+	 */
345
+	public function fieldIsIgnored($field_obj)
346
+	{
347
+		return $this->isSubclassOfOne($field_obj, $this->fieldsIgnored());
348
+	}
349
+
350
+
351
+	/**
352
+	 * Returns the list of model field classes that have a "raw" and non-raw formats.
353
+	 * Normally the "raw" versions are only accessible to those who can edit them.
354
+	 *
355
+	 * @return array an array of EE_Model_Field_Base child classnames
356
+	 */
357
+	public function fieldsThatHaveRenderedFormat()
358
+	{
359
+		return apply_filters(
360
+			'FHEE__Controller_Model_Read__fields_raw',
361
+			array('EE_Post_Content_Field', 'EE_Full_HTML_Field')
362
+		);
363
+	}
364
+
365
+
366
+	/**
367
+	 * If this field one that has a raw format
368
+	 *
369
+	 * @param EE_Model_Field_Base
370
+	 * @return boolean
371
+	 */
372
+	public function fieldHasRenderedFormat($field_obj)
373
+	{
374
+		return $this->isSubclassOfOne($field_obj, $this->fieldsThatHaveRenderedFormat());
375
+	}
376
+
377
+
378
+	/**
379
+	 * Returns the list of model field classes that have a "_pretty" and non-pretty versions.
380
+	 * The pretty version of the field is NOT query-able or editable, but requires no extra permissions
381
+	 * to view
382
+	 *
383
+	 * @return array an array of EE_Model_Field_Base child classnames
384
+	 */
385
+	public function fieldsThatHavePrettyFormat()
386
+	{
387
+		return apply_filters(
388
+			'FHEE__Controller_Model_Read__fields_pretty',
389
+			array('EE_Enum_Integer_Field', 'EE_Enum_Text_Field', 'EE_Money_Field')
390
+		);
391
+	}
392
+
393
+
394
+	/**
395
+	 * If this field one that has a pretty equivalent
396
+	 *
397
+	 * @param EE_Model_Field_Base
398
+	 * @return boolean
399
+	 */
400
+	public function fieldHasPrettyFormat($field_obj)
401
+	{
402
+		return $this->isSubclassOfOne($field_obj, $this->fieldsThatHavePrettyFormat());
403
+	}
404
+
405
+
406
+	/**
407
+	 * Returns an array describing what extra API resource properties have been added through the versions
408
+	 *
409
+	 * @return array @see $this->_extra_resource_properties_for_models
410
+	 */
411
+	public function resourceChanges()
412
+	{
413
+		return $this->resource_changes;
414
+	}
415
+
416
+
417
+	/**
418
+	 * Returns an array where keys are extra resource properties in this version of the API,
419
+	 * and values are key-value pairs describing the new properties. @see Model_Version::_resource_changes
420
+	 *
421
+	 * @param \EEM_Base $model
422
+	 * @return array
423
+	 */
424
+	public function extraResourcePropertiesForModel($model)
425
+	{
426
+		$extra_properties = array();
427
+		foreach ($this->resourceChangesBetweenRequestedVersionAndCurrent() as $version => $model_classnames) {
428
+			foreach ($model_classnames as $model_classname => $properties_added_in_this_version) {
429
+				if (is_subclass_of($model, $model_classname)) {
430
+					$extra_properties = array_merge($extra_properties, $properties_added_in_this_version);
431
+				}
432
+			}
433
+		}
434
+		return $extra_properties;
435
+	}
436
+
437
+
438
+	/**
439
+	 * Gets all the related models for the specified model. It's good to use this
440
+	 * in case this model didn't exist for this version or something
441
+	 *
442
+	 * @param \EEM_Base $model
443
+	 * @return \EE_Model_Relation_Base[]
444
+	 */
445
+	public function relationSettings(\EEM_Base $model)
446
+	{
447
+		$relations = array();
448
+		foreach ($model->relation_settings() as $relation_name => $relation_obj) {
449
+			if ($this->isModelNameInThisVersion($relation_name)) {
450
+				$relations[ $relation_name ] = $relation_obj;
451
+			}
452
+		}
453
+		// filter the results, but use the old filter name
454
+		return apply_filters(
455
+			'FHEE__Read__create_entity_from_wpdb_result__related_models_to_include',
456
+			$relations,
457
+			$model
458
+		);
459
+	}
460 460
 }
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -114,10 +114,10 @@  discard block
 block discarded – undo
114 114
         foreach ($this->resource_changes as $version => $model_classnames) {
115 115
             foreach ($model_classnames as $model_classname => $extra_fields) {
116 116
                 foreach ($extra_fields as $fieldname => $field_data) {
117
-                    $this->resource_changes[ $model_classname ][ $fieldname ]['name'] = $fieldname;
117
+                    $this->resource_changes[$model_classname][$fieldname]['name'] = $fieldname;
118 118
                     foreach ($defaults as $attribute => $default_value) {
119
-                        if (! isset($this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ])) {
120
-                            $this->resource_changes[ $model_classname ][ $fieldname ][ $attribute ] = $default_value;
119
+                        if ( ! isset($this->resource_changes[$model_classname][$fieldname][$attribute])) {
120
+                            $this->resource_changes[$model_classname][$fieldname][$attribute] = $default_value;
121 121
                         }
122 122
                     }
123 123
                 }
@@ -139,7 +139,7 @@  discard block
 block discarded – undo
139 139
             $model_changes = array();
140 140
             foreach ($this->modelChanges() as $version => $models_changed_in_version) {
141 141
                 if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
142
-                    $model_changes[ $version ] = $models_changed_in_version;
142
+                    $model_changes[$version] = $models_changed_in_version;
143 143
                 }
144 144
             }
145 145
             $this->cached_model_changes_between_requested_version_and_current = $model_changes;
@@ -161,7 +161,7 @@  discard block
 block discarded – undo
161 161
             $resource_changes = array();
162 162
             foreach ($this->resourceChanges() as $version => $model_classnames) {
163 163
                 if ($version <= EED_Core_Rest_Api::core_version() && $version > $this->requestedVersion()) {
164
-                    $resource_changes[ $version ] = $model_classnames;
164
+                    $resource_changes[$version] = $model_classnames;
165 165
                 }
166 166
             }
167 167
             $this->cached_resource_changes_between_requested_version_and_current = $resource_changes;
@@ -212,7 +212,7 @@  discard block
 block discarded – undo
212 212
             foreach ($this->modelChangesBetweenRequestedVersionAndCurrent() as $version => $models_changed) {
213 213
                 foreach ($models_changed as $model_name => $new_indicator_or_fields_added) {
214 214
                     if ($new_indicator_or_fields_added === ModelVersionInfo::MODEL_ADDED) {
215
-                        unset($all_models_in_current_version[ $model_name ]);
215
+                        unset($all_models_in_current_version[$model_name]);
216 216
                     }
217 217
                 }
218 218
             }
@@ -237,7 +237,7 @@  discard block
 block discarded – undo
237 237
     public function isModelNameInThisVersion($model_name)
238 238
     {
239 239
         $model_names = $this->modelsForRequestedVersion();
240
-        if (isset($model_names[ $model_name ])) {
240
+        if (isset($model_names[$model_name])) {
241 241
             return true;
242 242
         } else {
243 243
             return false;
@@ -280,19 +280,19 @@  discard block
 block discarded – undo
280 280
      */
281 281
     public function fieldsOnModelInThisVersion($model)
282 282
     {
283
-        if (! isset($this->cached_fields_on_models[ $model->get_this_model_name() ])) {
283
+        if ( ! isset($this->cached_fields_on_models[$model->get_this_model_name()])) {
284 284
             // get all model changes between the requested version and current core version
285 285
             $changes = $this->modelChangesBetweenRequestedVersionAndCurrent();
286 286
             // fetch all fields currently on this model
287 287
             $current_fields = $model->field_settings();
288 288
             // remove all fields that have been added since
289 289
             foreach ($changes as $version => $changes_in_version) {
290
-                if (isset($changes_in_version[ $model->get_this_model_name() ])
291
-                    && $changes_in_version[ $model->get_this_model_name() ] !== ModelVersionInfo::MODEL_ADDED
290
+                if (isset($changes_in_version[$model->get_this_model_name()])
291
+                    && $changes_in_version[$model->get_this_model_name()] !== ModelVersionInfo::MODEL_ADDED
292 292
                 ) {
293 293
                     $current_fields = array_diff_key(
294 294
                         $current_fields,
295
-                        array_flip($changes_in_version[ $model->get_this_model_name() ])
295
+                        array_flip($changes_in_version[$model->get_this_model_name()])
296 296
                     );
297 297
                 }
298 298
             }
@@ -447,7 +447,7 @@  discard block
 block discarded – undo
447 447
         $relations = array();
448 448
         foreach ($model->relation_settings() as $relation_name => $relation_obj) {
449 449
             if ($this->isModelNameInThisVersion($relation_name)) {
450
-                $relations[ $relation_name ] = $relation_obj;
450
+                $relations[$relation_name] = $relation_obj;
451 451
             }
452 452
         }
453 453
         // filter the results, but use the old filter name
Please login to merge, or discard this patch.