Completed
Branch BUG/duplicate-event-categories (935838)
by
unknown
64:31 queued 46:29
created
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/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.
core/libraries/rest_api/Capabilities.php 2 patches
Indentation   +140 added lines, -140 removed lines patch added patch discarded remove patch
@@ -15,152 +15,152 @@
 block discarded – undo
15 15
 class Capabilities
16 16
 {
17 17
 
18
-    /**
19
-     * The current user can see at least SOME of these entities.
20
-     *
21
-     * @param EEM_Base $model
22
-     * @param string   $model_context one of the return values from EEM_Base::valid_cap_contexts()
23
-     * @return boolean
24
-     */
25
-    public static function currentUserHasPartialAccessTo($model, $model_context = EEM_Base::caps_read)
26
-    {
27
-        if (apply_filters(
28
-            'FHEE__Capabilities__current_user_has_partial_access_to__override_begin',
29
-            false,
30
-            $model,
31
-            $model
32
-        )) {
33
-            return true;
34
-        }
35
-        foreach ($model->caps_missing($model_context) as $capability_name => $restriction_obj) {
36
-            if ($restriction_obj instanceof \EE_Return_None_Where_Conditions) {
37
-                return false;
38
-            }
39
-        }
40
-        if (apply_filters(
41
-            'FHEE__Capabilities__current_user_has_partial_access_to__override_end',
42
-            false,
43
-            $model,
44
-            $model
45
-        )) {
46
-            return false;
47
-        }
48
-        return true;
49
-    }
18
+	/**
19
+	 * The current user can see at least SOME of these entities.
20
+	 *
21
+	 * @param EEM_Base $model
22
+	 * @param string   $model_context one of the return values from EEM_Base::valid_cap_contexts()
23
+	 * @return boolean
24
+	 */
25
+	public static function currentUserHasPartialAccessTo($model, $model_context = EEM_Base::caps_read)
26
+	{
27
+		if (apply_filters(
28
+			'FHEE__Capabilities__current_user_has_partial_access_to__override_begin',
29
+			false,
30
+			$model,
31
+			$model
32
+		)) {
33
+			return true;
34
+		}
35
+		foreach ($model->caps_missing($model_context) as $capability_name => $restriction_obj) {
36
+			if ($restriction_obj instanceof \EE_Return_None_Where_Conditions) {
37
+				return false;
38
+			}
39
+		}
40
+		if (apply_filters(
41
+			'FHEE__Capabilities__current_user_has_partial_access_to__override_end',
42
+			false,
43
+			$model,
44
+			$model
45
+		)) {
46
+			return false;
47
+		}
48
+		return true;
49
+	}
50 50
 
51 51
 
52
-    /**
53
-     * Gets an array of all the capabilities the current user is missing that affected
54
-     * the query
55
-     *
56
-     * @param EEM_Base $model
57
-     * @param string   $request_type one of the constants on WP_JSON_Server
58
-     * @return array
59
-     */
60
-    public static function getMissingPermissions($model, $request_type = EEM_Base::caps_read)
61
-    {
62
-        return $model->caps_missing($request_type);
63
-    }
52
+	/**
53
+	 * Gets an array of all the capabilities the current user is missing that affected
54
+	 * the query
55
+	 *
56
+	 * @param EEM_Base $model
57
+	 * @param string   $request_type one of the constants on WP_JSON_Server
58
+	 * @return array
59
+	 */
60
+	public static function getMissingPermissions($model, $request_type = EEM_Base::caps_read)
61
+	{
62
+		return $model->caps_missing($request_type);
63
+	}
64 64
 
65 65
 
66
-    /**
67
-     * Gets a string of all the capabilities the current user is missing that affected
68
-     * the query
69
-     *
70
-     * @param EEM_Base $model
71
-     * @param string   $model_context one of the return values from EEM_Base::valid_cap_contexts()
72
-     * @return string
73
-     */
74
-    public static function getMissingPermissionsString($model, $model_context = EEM_Base::caps_read)
75
-    {
76
-        return implode(',', array_keys(self::getMissingPermissions($model, $model_context)));
77
-    }
66
+	/**
67
+	 * Gets a string of all the capabilities the current user is missing that affected
68
+	 * the query
69
+	 *
70
+	 * @param EEM_Base $model
71
+	 * @param string   $model_context one of the return values from EEM_Base::valid_cap_contexts()
72
+	 * @return string
73
+	 */
74
+	public static function getMissingPermissionsString($model, $model_context = EEM_Base::caps_read)
75
+	{
76
+		return implode(',', array_keys(self::getMissingPermissions($model, $model_context)));
77
+	}
78 78
 
79 79
 
80
-    /**
81
-     * Takes a entity that's ready to be returned and removes fields which the user shouldn't be able to access.
82
-     *
83
-     * @param array            $entity
84
-     * @param EEM_Base         $model
85
-     * @param string           $request_type         one of the return values from EEM_Base::valid_cap_contexts()
86
-     * @param ModelVersionInfo $model_version_info
87
-     * @param string           $primary_key_string   result of EEM_Base::get_index_primary_key_string(), so that we can
88
-     *                                               use this with models that have no primary key
89
-     * @return array ready for converting into json
90
-     */
91
-    public static function filterOutInaccessibleEntityFields(
92
-        $entity,
93
-        $model,
94
-        $request_type,
95
-        $model_version_info,
96
-        $primary_key_string = null
97
-    ) {
98
-        // if they didn't provide the primary key string, we'll just hope we can figure it out
99
-        // from the entity (although it's preferred client code does it, because the entity might be missing
100
-        // necessary fields for creating the primary key string, or they could be named differently)
101
-        if ($primary_key_string === null) {
102
-            $primary_key_string = $model->get_index_primary_key_string(
103
-                $model->deduce_fields_n_values_from_cols_n_values($entity)
104
-            );
105
-        }
106
-        // we only care to do this for frontend reads and when the user can't edit the item
107
-        if ($request_type !== EEM_Base::caps_read
108
-            || $model->exists(
109
-                $model->alter_query_params_to_restrict_by_ID(
110
-                    $primary_key_string,
111
-                    array(
112
-                        'default_where_conditions' => 'none',
113
-                        'caps'                     => EEM_Base::caps_edit,
114
-                    )
115
-                )
116
-            )
117
-        ) {
118
-            return $entity;
119
-        }
120
-        foreach ($model->field_settings() as $field_name => $field_obj) {
121
-            if ($model_version_info->fieldHasRenderedFormat($field_obj)
122
-                && isset($entity[ $field_name ])
123
-                && is_array($entity[ $field_name ])
124
-                && isset($entity[ $field_name ]['raw'])
125
-            ) {
126
-                unset($entity[ $field_name ]['raw']);
127
-            }
128
-        }
129
-        // theoretically we may want to filter out specific fields for specific models
130
-        return apply_filters(
131
-            'FHEE__Capabilities__filter_out_inaccessible_entity_fields',
132
-            $entity,
133
-            $model,
134
-            $request_type
135
-        );
136
-    }
80
+	/**
81
+	 * Takes a entity that's ready to be returned and removes fields which the user shouldn't be able to access.
82
+	 *
83
+	 * @param array            $entity
84
+	 * @param EEM_Base         $model
85
+	 * @param string           $request_type         one of the return values from EEM_Base::valid_cap_contexts()
86
+	 * @param ModelVersionInfo $model_version_info
87
+	 * @param string           $primary_key_string   result of EEM_Base::get_index_primary_key_string(), so that we can
88
+	 *                                               use this with models that have no primary key
89
+	 * @return array ready for converting into json
90
+	 */
91
+	public static function filterOutInaccessibleEntityFields(
92
+		$entity,
93
+		$model,
94
+		$request_type,
95
+		$model_version_info,
96
+		$primary_key_string = null
97
+	) {
98
+		// if they didn't provide the primary key string, we'll just hope we can figure it out
99
+		// from the entity (although it's preferred client code does it, because the entity might be missing
100
+		// necessary fields for creating the primary key string, or they could be named differently)
101
+		if ($primary_key_string === null) {
102
+			$primary_key_string = $model->get_index_primary_key_string(
103
+				$model->deduce_fields_n_values_from_cols_n_values($entity)
104
+			);
105
+		}
106
+		// we only care to do this for frontend reads and when the user can't edit the item
107
+		if ($request_type !== EEM_Base::caps_read
108
+			|| $model->exists(
109
+				$model->alter_query_params_to_restrict_by_ID(
110
+					$primary_key_string,
111
+					array(
112
+						'default_where_conditions' => 'none',
113
+						'caps'                     => EEM_Base::caps_edit,
114
+					)
115
+				)
116
+			)
117
+		) {
118
+			return $entity;
119
+		}
120
+		foreach ($model->field_settings() as $field_name => $field_obj) {
121
+			if ($model_version_info->fieldHasRenderedFormat($field_obj)
122
+				&& isset($entity[ $field_name ])
123
+				&& is_array($entity[ $field_name ])
124
+				&& isset($entity[ $field_name ]['raw'])
125
+			) {
126
+				unset($entity[ $field_name ]['raw']);
127
+			}
128
+		}
129
+		// theoretically we may want to filter out specific fields for specific models
130
+		return apply_filters(
131
+			'FHEE__Capabilities__filter_out_inaccessible_entity_fields',
132
+			$entity,
133
+			$model,
134
+			$request_type
135
+		);
136
+	}
137 137
 
138 138
 
139
-    /**
140
-     * Verifies the current user has at least partial access to do this action on this model.
141
-     * If not, throws an exception (so we can define the code that sets up this error object
142
-     * once)
143
-     *
144
-     * @param EEM_Base $model
145
-     * @param string   $model_action_context
146
-     * @param string   $action_name
147
-     * @return void
148
-     * @throws RestException
149
-     */
150
-    public static function verifyAtLeastPartialAccessTo($model, $model_action_context, $action_name = 'list')
151
-    {
152
-        if (! Capabilities::currentUserHasPartialAccessTo($model, $model_action_context)) {
153
-            $model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
154
-            throw new RestException(
155
-                sprintf('rest_cannot_%s_%s', strtolower($action_name), $model_name_plural),
156
-                sprintf(
157
-                    __('Sorry, you are not allowed to %1$s %2$s. Missing permissions: %3$s', 'event_espresso'),
158
-                    $action_name,
159
-                    $model_name_plural,
160
-                    Capabilities::getMissingPermissionsString($model, $model_action_context)
161
-                ),
162
-                array('status' => 403)
163
-            );
164
-        }
165
-    }
139
+	/**
140
+	 * Verifies the current user has at least partial access to do this action on this model.
141
+	 * If not, throws an exception (so we can define the code that sets up this error object
142
+	 * once)
143
+	 *
144
+	 * @param EEM_Base $model
145
+	 * @param string   $model_action_context
146
+	 * @param string   $action_name
147
+	 * @return void
148
+	 * @throws RestException
149
+	 */
150
+	public static function verifyAtLeastPartialAccessTo($model, $model_action_context, $action_name = 'list')
151
+	{
152
+		if (! Capabilities::currentUserHasPartialAccessTo($model, $model_action_context)) {
153
+			$model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
154
+			throw new RestException(
155
+				sprintf('rest_cannot_%s_%s', strtolower($action_name), $model_name_plural),
156
+				sprintf(
157
+					__('Sorry, you are not allowed to %1$s %2$s. Missing permissions: %3$s', 'event_espresso'),
158
+					$action_name,
159
+					$model_name_plural,
160
+					Capabilities::getMissingPermissionsString($model, $model_action_context)
161
+				),
162
+				array('status' => 403)
163
+			);
164
+		}
165
+	}
166 166
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -119,11 +119,11 @@  discard block
 block discarded – undo
119 119
         }
120 120
         foreach ($model->field_settings() as $field_name => $field_obj) {
121 121
             if ($model_version_info->fieldHasRenderedFormat($field_obj)
122
-                && isset($entity[ $field_name ])
123
-                && is_array($entity[ $field_name ])
124
-                && isset($entity[ $field_name ]['raw'])
122
+                && isset($entity[$field_name])
123
+                && is_array($entity[$field_name])
124
+                && isset($entity[$field_name]['raw'])
125 125
             ) {
126
-                unset($entity[ $field_name ]['raw']);
126
+                unset($entity[$field_name]['raw']);
127 127
             }
128 128
         }
129 129
         // theoretically we may want to filter out specific fields for specific models
@@ -149,7 +149,7 @@  discard block
 block discarded – undo
149 149
      */
150 150
     public static function verifyAtLeastPartialAccessTo($model, $model_action_context, $action_name = 'list')
151 151
     {
152
-        if (! Capabilities::currentUserHasPartialAccessTo($model, $model_action_context)) {
152
+        if ( ! Capabilities::currentUserHasPartialAccessTo($model, $model_action_context)) {
153 153
             $model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
154 154
             throw new RestException(
155 155
                 sprintf('rest_cannot_%s_%s', strtolower($action_name), $model_name_plural),
Please login to merge, or discard this patch.
core/libraries/rest_api/calculations/Registration.php 2 patches
Indentation   +58 added lines, -58 removed lines patch added patch discarded remove patch
@@ -19,62 +19,62 @@
 block discarded – undo
19 19
 class Registration extends Calculations_Base
20 20
 {
21 21
 
22
-    /**
23
-     * Calculates the checkin status for each datetime this registration has access to
24
-     *
25
-     * @param array            $wpdb_row
26
-     * @param \WP_REST_Request $request
27
-     * @param Base             $controller
28
-     * @return array
29
-     * @throws \EE_Error
30
-     */
31
-    public static function datetimeCheckinStati($wpdb_row, $request, $controller)
32
-    {
33
-        if (is_array($wpdb_row) && isset($wpdb_row['Registration.REG_ID'])) {
34
-            $reg = EEM_Registration::instance()->get_one_by_ID($wpdb_row['Registration.REG_ID']);
35
-        } else {
36
-            $reg = null;
37
-        }
38
-        if (! $reg instanceof EE_Registration
39
-        ) {
40
-            throw new \EE_Error(
41
-                sprintf(
42
-                    __(
43
-                    // @codingStandardsIgnoreStart
44
-                        'Cannot calculate datetime_checkin_stati because the registration with ID %1$s (from database row %2$s) was not found',
45
-                        // @codingStandardsIgnoreEnd
46
-                        'event_espresso'
47
-                    ),
48
-                    $wpdb_row['Registration.REG_ID'],
49
-                    print_r($wpdb_row, true)
50
-                )
51
-            );
52
-        }
53
-        $datetime_ids = EEM_Datetime::instance()->get_col(
54
-            array(
55
-                array(
56
-                    'Ticket.TKT_ID' => $reg->ticket_ID(),
57
-                ),
58
-                'default_where_conditions' => \EEM_Base::default_where_conditions_minimum_all,
59
-            )
60
-        );
61
-        $checkin_stati = array();
62
-        foreach ($datetime_ids as $datetime_id) {
63
-            $status = $reg->check_in_status_for_datetime($datetime_id);
64
-            switch ($status) {
65
-                case EE_Checkin::status_checked_out:
66
-                    $status_pretty = 'OUT';
67
-                    break;
68
-                case EE_Checkin::status_checked_in:
69
-                    $status_pretty = 'IN';
70
-                    break;
71
-                case EE_Checkin::status_checked_never:
72
-                default:
73
-                    $status_pretty = 'NEVER';
74
-                    break;
75
-            }
76
-            $checkin_stati[ $datetime_id ] = $status_pretty;
77
-        }
78
-        return $checkin_stati;
79
-    }
22
+	/**
23
+	 * Calculates the checkin status for each datetime this registration has access to
24
+	 *
25
+	 * @param array            $wpdb_row
26
+	 * @param \WP_REST_Request $request
27
+	 * @param Base             $controller
28
+	 * @return array
29
+	 * @throws \EE_Error
30
+	 */
31
+	public static function datetimeCheckinStati($wpdb_row, $request, $controller)
32
+	{
33
+		if (is_array($wpdb_row) && isset($wpdb_row['Registration.REG_ID'])) {
34
+			$reg = EEM_Registration::instance()->get_one_by_ID($wpdb_row['Registration.REG_ID']);
35
+		} else {
36
+			$reg = null;
37
+		}
38
+		if (! $reg instanceof EE_Registration
39
+		) {
40
+			throw new \EE_Error(
41
+				sprintf(
42
+					__(
43
+					// @codingStandardsIgnoreStart
44
+						'Cannot calculate datetime_checkin_stati because the registration with ID %1$s (from database row %2$s) was not found',
45
+						// @codingStandardsIgnoreEnd
46
+						'event_espresso'
47
+					),
48
+					$wpdb_row['Registration.REG_ID'],
49
+					print_r($wpdb_row, true)
50
+				)
51
+			);
52
+		}
53
+		$datetime_ids = EEM_Datetime::instance()->get_col(
54
+			array(
55
+				array(
56
+					'Ticket.TKT_ID' => $reg->ticket_ID(),
57
+				),
58
+				'default_where_conditions' => \EEM_Base::default_where_conditions_minimum_all,
59
+			)
60
+		);
61
+		$checkin_stati = array();
62
+		foreach ($datetime_ids as $datetime_id) {
63
+			$status = $reg->check_in_status_for_datetime($datetime_id);
64
+			switch ($status) {
65
+				case EE_Checkin::status_checked_out:
66
+					$status_pretty = 'OUT';
67
+					break;
68
+				case EE_Checkin::status_checked_in:
69
+					$status_pretty = 'IN';
70
+					break;
71
+				case EE_Checkin::status_checked_never:
72
+				default:
73
+					$status_pretty = 'NEVER';
74
+					break;
75
+			}
76
+			$checkin_stati[ $datetime_id ] = $status_pretty;
77
+		}
78
+		return $checkin_stati;
79
+	}
80 80
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -35,7 +35,7 @@  discard block
 block discarded – undo
35 35
         } else {
36 36
             $reg = null;
37 37
         }
38
-        if (! $reg instanceof EE_Registration
38
+        if ( ! $reg instanceof EE_Registration
39 39
         ) {
40 40
             throw new \EE_Error(
41 41
                 sprintf(
@@ -73,7 +73,7 @@  discard block
 block discarded – undo
73 73
                     $status_pretty = 'NEVER';
74 74
                     break;
75 75
             }
76
-            $checkin_stati[ $datetime_id ] = $status_pretty;
76
+            $checkin_stati[$datetime_id] = $status_pretty;
77 77
         }
78 78
         return $checkin_stati;
79 79
     }
Please login to merge, or discard this patch.
core/libraries/batch/JobHandlers/DatetimeOffsetFix.php 2 patches
Indentation   +467 added lines, -467 removed lines patch added patch discarded remove patch
@@ -24,471 +24,471 @@
 block discarded – undo
24 24
 class DatetimeOffsetFix extends JobHandler
25 25
 {
26 26
 
27
-    /**
28
-     * Key for the option used to track which models have been processed when doing the batches.
29
-     */
30
-    const MODELS_TO_PROCESS_OPTION_KEY = 'ee_models_processed_for_datetime_offset_fix';
31
-
32
-
33
-    const COUNT_OF_MODELS_PROCESSED = 'ee_count_of_ee_models_processed_for_datetime_offset_fixed';
34
-
35
-    /**
36
-     * Key for the option used to track what the current offset is that will be applied when this tool is executed.
37
-     */
38
-    const OFFSET_TO_APPLY_OPTION_KEY = 'ee_datetime_offset_fix_offset_to_apply';
39
-
40
-
41
-    const OPTION_KEY_OFFSET_RANGE_START_DATE = 'ee_datetime_offset_start_date_range';
42
-
43
-
44
-    const OPTION_KEY_OFFSET_RANGE_END_DATE = 'ee_datetime_offset_end_date_range';
45
-
46
-
47
-    /**
48
-     * String labelling the datetime offset fix type for change-log entries.
49
-     */
50
-    const DATETIME_OFFSET_FIX_CHANGELOG_TYPE = 'datetime_offset_fix';
51
-
52
-
53
-    /**
54
-     * String labelling a datetime offset fix error for change-log entries.
55
-     */
56
-    const DATETIME_OFFSET_FIX_CHANGELOG_ERROR_TYPE = 'datetime_offset_fix_error';
57
-
58
-    /**
59
-     * @var EEM_Base[]
60
-     */
61
-    protected $models_with_datetime_fields = array();
62
-
63
-    // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
64
-
65
-    /**
66
-     * Performs any necessary setup for starting the job. This is also a good
67
-     * place to setup the $job_arguments which will be used for subsequent HTTP requests
68
-     * when continue_job will be called
69
-     *
70
-     * @param JobParameters $job_parameters
71
-     * @return JobStepResponse
72
-     * @throws EE_Error
73
-     * @throws InvalidArgumentException
74
-     * @throws InvalidDataTypeException
75
-     * @throws InvalidInterfaceException
76
-     */
77
-    public function create_job(JobParameters $job_parameters)
78
-    {
79
-        $models_with_datetime_fields = $this->getModelsWithDatetimeFields();
80
-        // we'll be doing each model as a batch.
81
-        $job_parameters->set_job_size(count($models_with_datetime_fields));
82
-        return new JobStepResponse(
83
-            $job_parameters,
84
-            esc_html__('Starting Datetime Offset Fix', 'event_espresso')
85
-        );
86
-    }
87
-
88
-    /**
89
-     * Performs another step of the job
90
-     *
91
-     * @param JobParameters $job_parameters
92
-     * @param int           $batch_size
93
-     * @return JobStepResponse
94
-     * @throws EE_Error
95
-     * @throws InvalidArgumentException
96
-     * @throws InvalidDataTypeException
97
-     * @throws InvalidInterfaceException
98
-     */
99
-    public function continue_job(JobParameters $job_parameters, $batch_size = 50)
100
-    {
101
-        $models_to_process = $this->getModelsWithDatetimeFields();
102
-        // let's pop off the a model and do the query to apply the offset.
103
-        $model_to_process = array_pop($models_to_process);
104
-        // update our record
105
-        $this->setModelsToProcess($models_to_process);
106
-        $this->processModel($model_to_process);
107
-        $this->updateCountOfModelsProcessed();
108
-        $job_parameters->set_units_processed($this->getCountOfModelsProcessed());
109
-        if (count($models_to_process) > 0) {
110
-            $job_parameters->set_status(JobParameters::status_continue);
111
-        } else {
112
-            $job_parameters->set_status(JobParameters::status_complete);
113
-        }
114
-        return new JobStepResponse(
115
-            $job_parameters,
116
-            sprintf(
117
-                esc_html__('Updated the offset for all datetime fields on the %s model.', 'event_espresso'),
118
-                $model_to_process
119
-            )
120
-        );
121
-    }
122
-
123
-    /**
124
-     * Performs any clean-up logic when we know the job is completed
125
-     *
126
-     * @param JobParameters $job_parameters
127
-     * @return JobStepResponse
128
-     * @throws BatchRequestException
129
-     */
130
-    public function cleanup_job(JobParameters $job_parameters)
131
-    {
132
-        // delete important saved options.
133
-        delete_option(self::MODELS_TO_PROCESS_OPTION_KEY);
134
-        delete_option(self::COUNT_OF_MODELS_PROCESSED);
135
-        delete_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE);
136
-        delete_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE);
137
-        return new JobStepResponse($job_parameters, esc_html__(
138
-            'Offset has been applied to all affected fields.',
139
-            'event_espresso'
140
-        ));
141
-    }
142
-
143
-
144
-    /**
145
-     * Contains the logic for processing a model and applying the datetime offset to affected fields on that model.
146
-     *
147
-     * @param string $model_class_name
148
-     * @throws EE_Error
149
-     */
150
-    protected function processModel($model_class_name)
151
-    {
152
-        global $wpdb;
153
-        /** @var EEM_Base $model */
154
-        $model = $model_class_name::instance();
155
-        $original_offset = self::getOffset();
156
-        $start_date_range = self::getStartDateRange();
157
-        $end_date_range = self::getEndDateRange();
158
-        $sql_date_function = $original_offset > 0 ? 'DATE_ADD' : 'DATE_SUB';
159
-        $offset = abs($original_offset) * 60;
160
-        $date_ranges = array();
161
-        // since some affected models might have two tables, we have to get our tables and set up a query for each table.
162
-        foreach ($model->get_tables() as $table) {
163
-            $query = 'UPDATE ' . $table->get_table_name();
164
-            $fields_affected = array();
165
-            $inner_query = array();
166
-            foreach ($model->_get_fields_for_table($table->get_table_alias()) as $model_field) {
167
-                if ($model_field instanceof EE_Datetime_Field) {
168
-                    $inner_query[ $model_field->get_table_column() ] = $model_field->get_table_column() . ' = '
169
-                                                                       . $sql_date_function . '('
170
-                                                                       . $model_field->get_table_column()
171
-                                                                       . ", INTERVAL {$offset} MINUTE)";
172
-                    $fields_affected[] = $model_field;
173
-                }
174
-            }
175
-            if (! $fields_affected) {
176
-                continue;
177
-            }
178
-            // do we do one query per column/field or one query for all fields on the model? It all depends on whether
179
-            // there is a date range applied or not.
180
-            if ($start_date_range instanceof DbSafeDateTime || $end_date_range instanceof DbSafeDateTime) {
181
-                $result = $this->doQueryForEachField($query, $inner_query, $start_date_range, $end_date_range);
182
-            } else {
183
-                $result = $this->doQueryForAllFields($query, $inner_query);
184
-            }
185
-
186
-            // record appropriate logs for the query
187
-            switch (true) {
188
-                case $result === false:
189
-                    // record error.
190
-                    $error_message = $wpdb->last_error;
191
-                    // handle the edgecases where last_error might be empty.
192
-                    if (! $error_message) {
193
-                        $error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
194
-                    }
195
-                    $this->recordChangeLog($model, $original_offset, $table, $fields_affected, $error_message);
196
-                    break;
197
-                case is_array($result) && ! empty($result):
198
-                    foreach ($result as $field_name => $error_message) {
199
-                        $this->recordChangeLog($model, $original_offset, $table, array($field_name), $error_message);
200
-                    }
201
-                    break;
202
-                default:
203
-                    $this->recordChangeLog($model, $original_offset, $table, $fields_affected);
204
-            }
205
-        }
206
-    }
207
-
208
-
209
-    /**
210
-     * Does the query on each $inner_query individually.
211
-     *
212
-     * @param string              $query
213
-     * @param array               $inner_query
214
-     * @param DbSafeDateTime|null $start_date_range
215
-     * @param DbSafeDateTime|null $end_date_range
216
-     * @return array  An array of any errors encountered and the fields they were for.
217
-     */
218
-    private function doQueryForEachField($query, array $inner_query, $start_date_range, $end_date_range)
219
-    {
220
-        global $wpdb;
221
-        $errors = array();
222
-        foreach ($inner_query as $field_name => $field_query) {
223
-            $query_to_run = $query;
224
-            $where_conditions = array();
225
-            $query_to_run .= ' SET ' . $field_query;
226
-            if ($start_date_range instanceof DbSafeDateTime) {
227
-                $start_date = $start_date_range->format(EE_Datetime_Field::mysql_timestamp_format);
228
-                $where_conditions[] = "{$field_name} > '{$start_date}'";
229
-            }
230
-            if ($end_date_range instanceof DbSafeDateTime) {
231
-                $end_date = $end_date_range->format(EE_Datetime_Field::mysql_timestamp_format);
232
-                $where_conditions[] = "{$field_name} < '{$end_date}'";
233
-            }
234
-            if ($where_conditions) {
235
-                $query_to_run .= ' WHERE ' . implode(' AND ', $where_conditions);
236
-            }
237
-            $result = $wpdb->query($query_to_run);
238
-            if ($result === false) {
239
-                // record error.
240
-                $error_message = $wpdb->last_error;
241
-                // handle the edgecases where last_error might be empty.
242
-                if (! $error_message) {
243
-                    $error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
244
-                }
245
-                $errors[ $field_name ] = $error_message;
246
-            }
247
-        }
248
-        return $errors;
249
-    }
250
-
251
-
252
-    /**
253
-     * Performs the query for all fields within the inner_query
254
-     *
255
-     * @param string $query
256
-     * @param array  $inner_query
257
-     * @return false|int
258
-     */
259
-    private function doQueryForAllFields($query, array $inner_query)
260
-    {
261
-        global $wpdb;
262
-        $query .= ' SET ' . implode(',', $inner_query);
263
-        return $wpdb->query($query);
264
-    }
265
-
266
-
267
-    /**
268
-     * Records a changelog entry using the given information.
269
-     *
270
-     * @param EEM_Base              $model
271
-     * @param float                 $offset
272
-     * @param EE_Table_Base         $table
273
-     * @param EE_Model_Field_Base[] $model_fields_affected
274
-     * @param string                $error_message If present then there was an error so let's record that instead.
275
-     * @throws EE_Error
276
-     */
277
-    private function recordChangeLog(
278
-        EEM_Base $model,
279
-        $offset,
280
-        EE_Table_Base $table,
281
-        $model_fields_affected,
282
-        $error_message = ''
283
-    ) {
284
-        // setup $fields list.
285
-        $fields = array();
286
-        /** @var EE_Datetime_Field $model_field */
287
-        foreach ($model_fields_affected as $model_field) {
288
-            if (! $model_field instanceof EE_Datetime_Field) {
289
-                continue;
290
-            }
291
-            $fields[] = $model_field->get_name();
292
-        }
293
-        // setup the message for the changelog entry.
294
-        $message = $error_message
295
-            ? sprintf(
296
-                esc_html__(
297
-                    'The %1$s table for the %2$s model did not have the offset of %3$f applied to its fields (%4$s), because of the following error:%5$s',
298
-                    'event_espresso'
299
-                ),
300
-                $table->get_table_name(),
301
-                $model->get_this_model_name(),
302
-                $offset,
303
-                implode(',', $fields),
304
-                $error_message
305
-            )
306
-            : sprintf(
307
-                esc_html__(
308
-                    'The %1$s table for the %2$s model has had the offset of %3$f applied to its following fields: %4$s',
309
-                    'event_espresso'
310
-                ),
311
-                $table->get_table_name(),
312
-                $model->get_this_model_name(),
313
-                $offset,
314
-                implode(',', $fields)
315
-            );
316
-        // write to the log
317
-        $changelog = EE_Change_Log::new_instance(array(
318
-            'LOG_type'    => $error_message
319
-                ? self::DATETIME_OFFSET_FIX_CHANGELOG_ERROR_TYPE
320
-                : self::DATETIME_OFFSET_FIX_CHANGELOG_TYPE,
321
-            'LOG_message' => $message,
322
-        ));
323
-        $changelog->save();
324
-    }
325
-
326
-
327
-    /**
328
-     * Returns an array of models that have datetime fields.
329
-     * This array is added to a short lived transient cache to keep having to build this list to a minimum.
330
-     *
331
-     * @return array an array of model class names.
332
-     * @throws EE_Error
333
-     * @throws InvalidDataTypeException
334
-     * @throws InvalidInterfaceException
335
-     * @throws InvalidArgumentException
336
-     */
337
-    private function getModelsWithDatetimeFields()
338
-    {
339
-        $this->getModelsToProcess();
340
-        if (! empty($this->models_with_datetime_fields)) {
341
-            return $this->models_with_datetime_fields;
342
-        }
343
-
344
-        $all_non_abstract_models = EE_Registry::instance()->non_abstract_db_models;
345
-        foreach ($all_non_abstract_models as $non_abstract_model) {
346
-            // get model instance
347
-            /** @var EEM_Base $non_abstract_model */
348
-            $non_abstract_model = $non_abstract_model::instance();
349
-            if ($non_abstract_model->get_a_field_of_type('EE_Datetime_Field') instanceof EE_Datetime_Field) {
350
-                $this->models_with_datetime_fields[] = get_class($non_abstract_model);
351
-            }
352
-        }
353
-        $this->setModelsToProcess($this->models_with_datetime_fields);
354
-        return $this->models_with_datetime_fields;
355
-    }
356
-
357
-
358
-    /**
359
-     * This simply records the models that have been processed with our tracking option.
360
-     *
361
-     * @param array $models_to_set array of model class names.
362
-     */
363
-    private function setModelsToProcess($models_to_set)
364
-    {
365
-        update_option(self::MODELS_TO_PROCESS_OPTION_KEY, $models_to_set);
366
-    }
367
-
368
-
369
-    /**
370
-     * Used to keep track of how many models have been processed for the batch
371
-     *
372
-     * @param $count
373
-     */
374
-    private function updateCountOfModelsProcessed($count = 1)
375
-    {
376
-        $count = $this->getCountOfModelsProcessed() + (int) $count;
377
-        update_option(self::COUNT_OF_MODELS_PROCESSED, $count);
378
-    }
379
-
380
-
381
-    /**
382
-     * Retrieve the tracked number of models processed between requests.
383
-     *
384
-     * @return int
385
-     */
386
-    private function getCountOfModelsProcessed()
387
-    {
388
-        return (int) get_option(self::COUNT_OF_MODELS_PROCESSED, 0);
389
-    }
390
-
391
-
392
-    /**
393
-     * Returns the models that are left to process.
394
-     *
395
-     * @return array  an array of model class names.
396
-     */
397
-    private function getModelsToProcess()
398
-    {
399
-        if (empty($this->models_with_datetime_fields)) {
400
-            $this->models_with_datetime_fields = get_option(self::MODELS_TO_PROCESS_OPTION_KEY, array());
401
-        }
402
-        return $this->models_with_datetime_fields;
403
-    }
404
-
405
-
406
-    /**
407
-     * Used to record the offset that will be applied to dates and times for EE_Datetime_Field columns.
408
-     *
409
-     * @param float $offset
410
-     */
411
-    public static function updateOffset($offset)
412
-    {
413
-        update_option(self::OFFSET_TO_APPLY_OPTION_KEY, $offset);
414
-    }
415
-
416
-
417
-    /**
418
-     * Used to retrieve the saved offset that will be applied to dates and times for EE_Datetime_Field columns.
419
-     *
420
-     * @return float
421
-     */
422
-    public static function getOffset()
423
-    {
424
-        return (float) get_option(self::OFFSET_TO_APPLY_OPTION_KEY, 0);
425
-    }
426
-
427
-
428
-    /**
429
-     * Used to set the saved offset range start date.
430
-     *
431
-     * @param DbSafeDateTime|null $start_date
432
-     */
433
-    public static function updateStartDateRange(DbSafeDateTime $start_date = null)
434
-    {
435
-        $date_to_save = $start_date instanceof DbSafeDateTime
436
-            ? $start_date->format('U')
437
-            : '';
438
-        update_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE, $date_to_save);
439
-    }
440
-
441
-
442
-    /**
443
-     * Used to get the saved offset range start date.
444
-     *
445
-     * @return DbSafeDateTime|null
446
-     */
447
-    public static function getStartDateRange()
448
-    {
449
-        $start_date = get_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE, null);
450
-        try {
451
-            $datetime = DateTime::createFromFormat('U', $start_date, new DateTimeZone('UTC'));
452
-            $start_date = $datetime instanceof DateTime
453
-                ? DbSafeDateTime::createFromDateTime($datetime)
454
-                : null;
455
-        } catch (Exception $e) {
456
-            $start_date = null;
457
-        }
458
-        return $start_date;
459
-    }
460
-
461
-
462
-    /**
463
-     * Used to set the saved offset range end date.
464
-     *
465
-     * @param DbSafeDateTime|null $end_date
466
-     */
467
-    public static function updateEndDateRange(DbSafeDateTime $end_date = null)
468
-    {
469
-        $date_to_save = $end_date instanceof DbSafeDateTime
470
-            ? $end_date->format('U')
471
-            : '';
472
-        update_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE, $date_to_save);
473
-    }
474
-
475
-
476
-    /**
477
-     * Used to get the saved offset range end date.
478
-     *
479
-     * @return DbSafeDateTime|null
480
-     */
481
-    public static function getEndDateRange()
482
-    {
483
-        $end_date = get_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE, null);
484
-        try {
485
-            $datetime = DateTime::createFromFormat('U', $end_date, new DateTimeZone('UTC'));
486
-            $end_date = $datetime instanceof Datetime
487
-                ? DbSafeDateTime::createFromDateTime($datetime)
488
-                : null;
489
-        } catch (Exception $e) {
490
-            $end_date = null;
491
-        }
492
-        return $end_date;
493
-    }
27
+	/**
28
+	 * Key for the option used to track which models have been processed when doing the batches.
29
+	 */
30
+	const MODELS_TO_PROCESS_OPTION_KEY = 'ee_models_processed_for_datetime_offset_fix';
31
+
32
+
33
+	const COUNT_OF_MODELS_PROCESSED = 'ee_count_of_ee_models_processed_for_datetime_offset_fixed';
34
+
35
+	/**
36
+	 * Key for the option used to track what the current offset is that will be applied when this tool is executed.
37
+	 */
38
+	const OFFSET_TO_APPLY_OPTION_KEY = 'ee_datetime_offset_fix_offset_to_apply';
39
+
40
+
41
+	const OPTION_KEY_OFFSET_RANGE_START_DATE = 'ee_datetime_offset_start_date_range';
42
+
43
+
44
+	const OPTION_KEY_OFFSET_RANGE_END_DATE = 'ee_datetime_offset_end_date_range';
45
+
46
+
47
+	/**
48
+	 * String labelling the datetime offset fix type for change-log entries.
49
+	 */
50
+	const DATETIME_OFFSET_FIX_CHANGELOG_TYPE = 'datetime_offset_fix';
51
+
52
+
53
+	/**
54
+	 * String labelling a datetime offset fix error for change-log entries.
55
+	 */
56
+	const DATETIME_OFFSET_FIX_CHANGELOG_ERROR_TYPE = 'datetime_offset_fix_error';
57
+
58
+	/**
59
+	 * @var EEM_Base[]
60
+	 */
61
+	protected $models_with_datetime_fields = array();
62
+
63
+	// phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
64
+
65
+	/**
66
+	 * Performs any necessary setup for starting the job. This is also a good
67
+	 * place to setup the $job_arguments which will be used for subsequent HTTP requests
68
+	 * when continue_job will be called
69
+	 *
70
+	 * @param JobParameters $job_parameters
71
+	 * @return JobStepResponse
72
+	 * @throws EE_Error
73
+	 * @throws InvalidArgumentException
74
+	 * @throws InvalidDataTypeException
75
+	 * @throws InvalidInterfaceException
76
+	 */
77
+	public function create_job(JobParameters $job_parameters)
78
+	{
79
+		$models_with_datetime_fields = $this->getModelsWithDatetimeFields();
80
+		// we'll be doing each model as a batch.
81
+		$job_parameters->set_job_size(count($models_with_datetime_fields));
82
+		return new JobStepResponse(
83
+			$job_parameters,
84
+			esc_html__('Starting Datetime Offset Fix', 'event_espresso')
85
+		);
86
+	}
87
+
88
+	/**
89
+	 * Performs another step of the job
90
+	 *
91
+	 * @param JobParameters $job_parameters
92
+	 * @param int           $batch_size
93
+	 * @return JobStepResponse
94
+	 * @throws EE_Error
95
+	 * @throws InvalidArgumentException
96
+	 * @throws InvalidDataTypeException
97
+	 * @throws InvalidInterfaceException
98
+	 */
99
+	public function continue_job(JobParameters $job_parameters, $batch_size = 50)
100
+	{
101
+		$models_to_process = $this->getModelsWithDatetimeFields();
102
+		// let's pop off the a model and do the query to apply the offset.
103
+		$model_to_process = array_pop($models_to_process);
104
+		// update our record
105
+		$this->setModelsToProcess($models_to_process);
106
+		$this->processModel($model_to_process);
107
+		$this->updateCountOfModelsProcessed();
108
+		$job_parameters->set_units_processed($this->getCountOfModelsProcessed());
109
+		if (count($models_to_process) > 0) {
110
+			$job_parameters->set_status(JobParameters::status_continue);
111
+		} else {
112
+			$job_parameters->set_status(JobParameters::status_complete);
113
+		}
114
+		return new JobStepResponse(
115
+			$job_parameters,
116
+			sprintf(
117
+				esc_html__('Updated the offset for all datetime fields on the %s model.', 'event_espresso'),
118
+				$model_to_process
119
+			)
120
+		);
121
+	}
122
+
123
+	/**
124
+	 * Performs any clean-up logic when we know the job is completed
125
+	 *
126
+	 * @param JobParameters $job_parameters
127
+	 * @return JobStepResponse
128
+	 * @throws BatchRequestException
129
+	 */
130
+	public function cleanup_job(JobParameters $job_parameters)
131
+	{
132
+		// delete important saved options.
133
+		delete_option(self::MODELS_TO_PROCESS_OPTION_KEY);
134
+		delete_option(self::COUNT_OF_MODELS_PROCESSED);
135
+		delete_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE);
136
+		delete_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE);
137
+		return new JobStepResponse($job_parameters, esc_html__(
138
+			'Offset has been applied to all affected fields.',
139
+			'event_espresso'
140
+		));
141
+	}
142
+
143
+
144
+	/**
145
+	 * Contains the logic for processing a model and applying the datetime offset to affected fields on that model.
146
+	 *
147
+	 * @param string $model_class_name
148
+	 * @throws EE_Error
149
+	 */
150
+	protected function processModel($model_class_name)
151
+	{
152
+		global $wpdb;
153
+		/** @var EEM_Base $model */
154
+		$model = $model_class_name::instance();
155
+		$original_offset = self::getOffset();
156
+		$start_date_range = self::getStartDateRange();
157
+		$end_date_range = self::getEndDateRange();
158
+		$sql_date_function = $original_offset > 0 ? 'DATE_ADD' : 'DATE_SUB';
159
+		$offset = abs($original_offset) * 60;
160
+		$date_ranges = array();
161
+		// since some affected models might have two tables, we have to get our tables and set up a query for each table.
162
+		foreach ($model->get_tables() as $table) {
163
+			$query = 'UPDATE ' . $table->get_table_name();
164
+			$fields_affected = array();
165
+			$inner_query = array();
166
+			foreach ($model->_get_fields_for_table($table->get_table_alias()) as $model_field) {
167
+				if ($model_field instanceof EE_Datetime_Field) {
168
+					$inner_query[ $model_field->get_table_column() ] = $model_field->get_table_column() . ' = '
169
+																	   . $sql_date_function . '('
170
+																	   . $model_field->get_table_column()
171
+																	   . ", INTERVAL {$offset} MINUTE)";
172
+					$fields_affected[] = $model_field;
173
+				}
174
+			}
175
+			if (! $fields_affected) {
176
+				continue;
177
+			}
178
+			// do we do one query per column/field or one query for all fields on the model? It all depends on whether
179
+			// there is a date range applied or not.
180
+			if ($start_date_range instanceof DbSafeDateTime || $end_date_range instanceof DbSafeDateTime) {
181
+				$result = $this->doQueryForEachField($query, $inner_query, $start_date_range, $end_date_range);
182
+			} else {
183
+				$result = $this->doQueryForAllFields($query, $inner_query);
184
+			}
185
+
186
+			// record appropriate logs for the query
187
+			switch (true) {
188
+				case $result === false:
189
+					// record error.
190
+					$error_message = $wpdb->last_error;
191
+					// handle the edgecases where last_error might be empty.
192
+					if (! $error_message) {
193
+						$error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
194
+					}
195
+					$this->recordChangeLog($model, $original_offset, $table, $fields_affected, $error_message);
196
+					break;
197
+				case is_array($result) && ! empty($result):
198
+					foreach ($result as $field_name => $error_message) {
199
+						$this->recordChangeLog($model, $original_offset, $table, array($field_name), $error_message);
200
+					}
201
+					break;
202
+				default:
203
+					$this->recordChangeLog($model, $original_offset, $table, $fields_affected);
204
+			}
205
+		}
206
+	}
207
+
208
+
209
+	/**
210
+	 * Does the query on each $inner_query individually.
211
+	 *
212
+	 * @param string              $query
213
+	 * @param array               $inner_query
214
+	 * @param DbSafeDateTime|null $start_date_range
215
+	 * @param DbSafeDateTime|null $end_date_range
216
+	 * @return array  An array of any errors encountered and the fields they were for.
217
+	 */
218
+	private function doQueryForEachField($query, array $inner_query, $start_date_range, $end_date_range)
219
+	{
220
+		global $wpdb;
221
+		$errors = array();
222
+		foreach ($inner_query as $field_name => $field_query) {
223
+			$query_to_run = $query;
224
+			$where_conditions = array();
225
+			$query_to_run .= ' SET ' . $field_query;
226
+			if ($start_date_range instanceof DbSafeDateTime) {
227
+				$start_date = $start_date_range->format(EE_Datetime_Field::mysql_timestamp_format);
228
+				$where_conditions[] = "{$field_name} > '{$start_date}'";
229
+			}
230
+			if ($end_date_range instanceof DbSafeDateTime) {
231
+				$end_date = $end_date_range->format(EE_Datetime_Field::mysql_timestamp_format);
232
+				$where_conditions[] = "{$field_name} < '{$end_date}'";
233
+			}
234
+			if ($where_conditions) {
235
+				$query_to_run .= ' WHERE ' . implode(' AND ', $where_conditions);
236
+			}
237
+			$result = $wpdb->query($query_to_run);
238
+			if ($result === false) {
239
+				// record error.
240
+				$error_message = $wpdb->last_error;
241
+				// handle the edgecases where last_error might be empty.
242
+				if (! $error_message) {
243
+					$error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
244
+				}
245
+				$errors[ $field_name ] = $error_message;
246
+			}
247
+		}
248
+		return $errors;
249
+	}
250
+
251
+
252
+	/**
253
+	 * Performs the query for all fields within the inner_query
254
+	 *
255
+	 * @param string $query
256
+	 * @param array  $inner_query
257
+	 * @return false|int
258
+	 */
259
+	private function doQueryForAllFields($query, array $inner_query)
260
+	{
261
+		global $wpdb;
262
+		$query .= ' SET ' . implode(',', $inner_query);
263
+		return $wpdb->query($query);
264
+	}
265
+
266
+
267
+	/**
268
+	 * Records a changelog entry using the given information.
269
+	 *
270
+	 * @param EEM_Base              $model
271
+	 * @param float                 $offset
272
+	 * @param EE_Table_Base         $table
273
+	 * @param EE_Model_Field_Base[] $model_fields_affected
274
+	 * @param string                $error_message If present then there was an error so let's record that instead.
275
+	 * @throws EE_Error
276
+	 */
277
+	private function recordChangeLog(
278
+		EEM_Base $model,
279
+		$offset,
280
+		EE_Table_Base $table,
281
+		$model_fields_affected,
282
+		$error_message = ''
283
+	) {
284
+		// setup $fields list.
285
+		$fields = array();
286
+		/** @var EE_Datetime_Field $model_field */
287
+		foreach ($model_fields_affected as $model_field) {
288
+			if (! $model_field instanceof EE_Datetime_Field) {
289
+				continue;
290
+			}
291
+			$fields[] = $model_field->get_name();
292
+		}
293
+		// setup the message for the changelog entry.
294
+		$message = $error_message
295
+			? sprintf(
296
+				esc_html__(
297
+					'The %1$s table for the %2$s model did not have the offset of %3$f applied to its fields (%4$s), because of the following error:%5$s',
298
+					'event_espresso'
299
+				),
300
+				$table->get_table_name(),
301
+				$model->get_this_model_name(),
302
+				$offset,
303
+				implode(',', $fields),
304
+				$error_message
305
+			)
306
+			: sprintf(
307
+				esc_html__(
308
+					'The %1$s table for the %2$s model has had the offset of %3$f applied to its following fields: %4$s',
309
+					'event_espresso'
310
+				),
311
+				$table->get_table_name(),
312
+				$model->get_this_model_name(),
313
+				$offset,
314
+				implode(',', $fields)
315
+			);
316
+		// write to the log
317
+		$changelog = EE_Change_Log::new_instance(array(
318
+			'LOG_type'    => $error_message
319
+				? self::DATETIME_OFFSET_FIX_CHANGELOG_ERROR_TYPE
320
+				: self::DATETIME_OFFSET_FIX_CHANGELOG_TYPE,
321
+			'LOG_message' => $message,
322
+		));
323
+		$changelog->save();
324
+	}
325
+
326
+
327
+	/**
328
+	 * Returns an array of models that have datetime fields.
329
+	 * This array is added to a short lived transient cache to keep having to build this list to a minimum.
330
+	 *
331
+	 * @return array an array of model class names.
332
+	 * @throws EE_Error
333
+	 * @throws InvalidDataTypeException
334
+	 * @throws InvalidInterfaceException
335
+	 * @throws InvalidArgumentException
336
+	 */
337
+	private function getModelsWithDatetimeFields()
338
+	{
339
+		$this->getModelsToProcess();
340
+		if (! empty($this->models_with_datetime_fields)) {
341
+			return $this->models_with_datetime_fields;
342
+		}
343
+
344
+		$all_non_abstract_models = EE_Registry::instance()->non_abstract_db_models;
345
+		foreach ($all_non_abstract_models as $non_abstract_model) {
346
+			// get model instance
347
+			/** @var EEM_Base $non_abstract_model */
348
+			$non_abstract_model = $non_abstract_model::instance();
349
+			if ($non_abstract_model->get_a_field_of_type('EE_Datetime_Field') instanceof EE_Datetime_Field) {
350
+				$this->models_with_datetime_fields[] = get_class($non_abstract_model);
351
+			}
352
+		}
353
+		$this->setModelsToProcess($this->models_with_datetime_fields);
354
+		return $this->models_with_datetime_fields;
355
+	}
356
+
357
+
358
+	/**
359
+	 * This simply records the models that have been processed with our tracking option.
360
+	 *
361
+	 * @param array $models_to_set array of model class names.
362
+	 */
363
+	private function setModelsToProcess($models_to_set)
364
+	{
365
+		update_option(self::MODELS_TO_PROCESS_OPTION_KEY, $models_to_set);
366
+	}
367
+
368
+
369
+	/**
370
+	 * Used to keep track of how many models have been processed for the batch
371
+	 *
372
+	 * @param $count
373
+	 */
374
+	private function updateCountOfModelsProcessed($count = 1)
375
+	{
376
+		$count = $this->getCountOfModelsProcessed() + (int) $count;
377
+		update_option(self::COUNT_OF_MODELS_PROCESSED, $count);
378
+	}
379
+
380
+
381
+	/**
382
+	 * Retrieve the tracked number of models processed between requests.
383
+	 *
384
+	 * @return int
385
+	 */
386
+	private function getCountOfModelsProcessed()
387
+	{
388
+		return (int) get_option(self::COUNT_OF_MODELS_PROCESSED, 0);
389
+	}
390
+
391
+
392
+	/**
393
+	 * Returns the models that are left to process.
394
+	 *
395
+	 * @return array  an array of model class names.
396
+	 */
397
+	private function getModelsToProcess()
398
+	{
399
+		if (empty($this->models_with_datetime_fields)) {
400
+			$this->models_with_datetime_fields = get_option(self::MODELS_TO_PROCESS_OPTION_KEY, array());
401
+		}
402
+		return $this->models_with_datetime_fields;
403
+	}
404
+
405
+
406
+	/**
407
+	 * Used to record the offset that will be applied to dates and times for EE_Datetime_Field columns.
408
+	 *
409
+	 * @param float $offset
410
+	 */
411
+	public static function updateOffset($offset)
412
+	{
413
+		update_option(self::OFFSET_TO_APPLY_OPTION_KEY, $offset);
414
+	}
415
+
416
+
417
+	/**
418
+	 * Used to retrieve the saved offset that will be applied to dates and times for EE_Datetime_Field columns.
419
+	 *
420
+	 * @return float
421
+	 */
422
+	public static function getOffset()
423
+	{
424
+		return (float) get_option(self::OFFSET_TO_APPLY_OPTION_KEY, 0);
425
+	}
426
+
427
+
428
+	/**
429
+	 * Used to set the saved offset range start date.
430
+	 *
431
+	 * @param DbSafeDateTime|null $start_date
432
+	 */
433
+	public static function updateStartDateRange(DbSafeDateTime $start_date = null)
434
+	{
435
+		$date_to_save = $start_date instanceof DbSafeDateTime
436
+			? $start_date->format('U')
437
+			: '';
438
+		update_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE, $date_to_save);
439
+	}
440
+
441
+
442
+	/**
443
+	 * Used to get the saved offset range start date.
444
+	 *
445
+	 * @return DbSafeDateTime|null
446
+	 */
447
+	public static function getStartDateRange()
448
+	{
449
+		$start_date = get_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE, null);
450
+		try {
451
+			$datetime = DateTime::createFromFormat('U', $start_date, new DateTimeZone('UTC'));
452
+			$start_date = $datetime instanceof DateTime
453
+				? DbSafeDateTime::createFromDateTime($datetime)
454
+				: null;
455
+		} catch (Exception $e) {
456
+			$start_date = null;
457
+		}
458
+		return $start_date;
459
+	}
460
+
461
+
462
+	/**
463
+	 * Used to set the saved offset range end date.
464
+	 *
465
+	 * @param DbSafeDateTime|null $end_date
466
+	 */
467
+	public static function updateEndDateRange(DbSafeDateTime $end_date = null)
468
+	{
469
+		$date_to_save = $end_date instanceof DbSafeDateTime
470
+			? $end_date->format('U')
471
+			: '';
472
+		update_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE, $date_to_save);
473
+	}
474
+
475
+
476
+	/**
477
+	 * Used to get the saved offset range end date.
478
+	 *
479
+	 * @return DbSafeDateTime|null
480
+	 */
481
+	public static function getEndDateRange()
482
+	{
483
+		$end_date = get_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE, null);
484
+		try {
485
+			$datetime = DateTime::createFromFormat('U', $end_date, new DateTimeZone('UTC'));
486
+			$end_date = $datetime instanceof Datetime
487
+				? DbSafeDateTime::createFromDateTime($datetime)
488
+				: null;
489
+		} catch (Exception $e) {
490
+			$end_date = null;
491
+		}
492
+		return $end_date;
493
+	}
494 494
 }
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -160,19 +160,19 @@  discard block
 block discarded – undo
160 160
         $date_ranges = array();
161 161
         // since some affected models might have two tables, we have to get our tables and set up a query for each table.
162 162
         foreach ($model->get_tables() as $table) {
163
-            $query = 'UPDATE ' . $table->get_table_name();
163
+            $query = 'UPDATE '.$table->get_table_name();
164 164
             $fields_affected = array();
165 165
             $inner_query = array();
166 166
             foreach ($model->_get_fields_for_table($table->get_table_alias()) as $model_field) {
167 167
                 if ($model_field instanceof EE_Datetime_Field) {
168
-                    $inner_query[ $model_field->get_table_column() ] = $model_field->get_table_column() . ' = '
169
-                                                                       . $sql_date_function . '('
168
+                    $inner_query[$model_field->get_table_column()] = $model_field->get_table_column().' = '
169
+                                                                       . $sql_date_function.'('
170 170
                                                                        . $model_field->get_table_column()
171 171
                                                                        . ", INTERVAL {$offset} MINUTE)";
172 172
                     $fields_affected[] = $model_field;
173 173
                 }
174 174
             }
175
-            if (! $fields_affected) {
175
+            if ( ! $fields_affected) {
176 176
                 continue;
177 177
             }
178 178
             // do we do one query per column/field or one query for all fields on the model? It all depends on whether
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
                     // record error.
190 190
                     $error_message = $wpdb->last_error;
191 191
                     // handle the edgecases where last_error might be empty.
192
-                    if (! $error_message) {
192
+                    if ( ! $error_message) {
193 193
                         $error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
194 194
                     }
195 195
                     $this->recordChangeLog($model, $original_offset, $table, $fields_affected, $error_message);
@@ -222,7 +222,7 @@  discard block
 block discarded – undo
222 222
         foreach ($inner_query as $field_name => $field_query) {
223 223
             $query_to_run = $query;
224 224
             $where_conditions = array();
225
-            $query_to_run .= ' SET ' . $field_query;
225
+            $query_to_run .= ' SET '.$field_query;
226 226
             if ($start_date_range instanceof DbSafeDateTime) {
227 227
                 $start_date = $start_date_range->format(EE_Datetime_Field::mysql_timestamp_format);
228 228
                 $where_conditions[] = "{$field_name} > '{$start_date}'";
@@ -232,17 +232,17 @@  discard block
 block discarded – undo
232 232
                 $where_conditions[] = "{$field_name} < '{$end_date}'";
233 233
             }
234 234
             if ($where_conditions) {
235
-                $query_to_run .= ' WHERE ' . implode(' AND ', $where_conditions);
235
+                $query_to_run .= ' WHERE '.implode(' AND ', $where_conditions);
236 236
             }
237 237
             $result = $wpdb->query($query_to_run);
238 238
             if ($result === false) {
239 239
                 // record error.
240 240
                 $error_message = $wpdb->last_error;
241 241
                 // handle the edgecases where last_error might be empty.
242
-                if (! $error_message) {
242
+                if ( ! $error_message) {
243 243
                     $error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
244 244
                 }
245
-                $errors[ $field_name ] = $error_message;
245
+                $errors[$field_name] = $error_message;
246 246
             }
247 247
         }
248 248
         return $errors;
@@ -259,7 +259,7 @@  discard block
 block discarded – undo
259 259
     private function doQueryForAllFields($query, array $inner_query)
260 260
     {
261 261
         global $wpdb;
262
-        $query .= ' SET ' . implode(',', $inner_query);
262
+        $query .= ' SET '.implode(',', $inner_query);
263 263
         return $wpdb->query($query);
264 264
     }
265 265
 
@@ -285,7 +285,7 @@  discard block
 block discarded – undo
285 285
         $fields = array();
286 286
         /** @var EE_Datetime_Field $model_field */
287 287
         foreach ($model_fields_affected as $model_field) {
288
-            if (! $model_field instanceof EE_Datetime_Field) {
288
+            if ( ! $model_field instanceof EE_Datetime_Field) {
289 289
                 continue;
290 290
             }
291 291
             $fields[] = $model_field->get_name();
@@ -337,7 +337,7 @@  discard block
 block discarded – undo
337 337
     private function getModelsWithDatetimeFields()
338 338
     {
339 339
         $this->getModelsToProcess();
340
-        if (! empty($this->models_with_datetime_fields)) {
340
+        if ( ! empty($this->models_with_datetime_fields)) {
341 341
             return $this->models_with_datetime_fields;
342 342
         }
343 343
 
Please login to merge, or discard this patch.