Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/elementor/data/base/endpoint.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 +
3 + namespace Elementor\Data\Base;
4 +
5 + use Elementor\Data\Manager;
6 + use WP_REST_Server;
7 +
8 + abstract class Endpoint {
9 +
10 + const AVAILABLE_METHODS = [
11 + WP_REST_Server::READABLE,
12 + WP_REST_Server::CREATABLE,
13 + WP_REST_Server::EDITABLE,
14 + WP_REST_Server::DELETABLE,
15 + WP_REST_Server::ALLMETHODS,
16 + ];
17 +
18 + /**
19 + * Controller of current endpoint.
20 + *
21 + * @var \Elementor\Data\Base\Controller
22 + */
23 + protected $controller;
24 +
25 + /**
26 + * Loaded sub endpoint(s).
27 + *
28 + * @var \Elementor\Data\Base\SubEndpoint[]
29 + */
30 + private $sub_endpoints = [];
31 +
32 + /**
33 + * Get format suffix.
34 + *
35 + * Examples:
36 + * '{one_parameter_name}'.
37 + * '{one_parameter_name}/{two_parameter_name}/'.
38 + * '{one_parameter_name}/whatever/anything/{two_parameter_name}/' and so on for each endpoint or sub-endpoint.
39 + *
40 + * @return string current location will later be added automatically.
41 + */
42 + public static function get_format() {
43 + return '';
44 + }
45 +
46 + /**
47 + * Endpoint constructor.
48 + *
49 + * @param \Elementor\Data\Base\Controller $controller
50 + *
51 + * @throws \Exception If invalid controller.
52 + */
53 + public function __construct( $controller ) {
54 + if ( ! ( $controller instanceof Controller ) ) {
55 + throw new \Exception( 'Invalid controller.' );
56 + }
57 +
58 + $this->controller = $controller;
59 + $this->register();
60 + }
61 +
62 + /**
63 + * Get endpoint name.
64 + *
65 + * @return string
66 + */
67 + abstract public function get_name();
68 +
69 + /**
70 + * Get base route.
71 + *
72 + * Removing 'index' from endpoint.
73 + *
74 + * @return string
75 + */
76 + public function get_base_route() {
77 + $endpoint_name = $this->get_name();
78 +
79 + // TODO: Allow this only for internal routes.
80 + // TODO: Make difference between internal and external endpoints.
81 + if ( 'index' === $endpoint_name ) {
82 + $endpoint_name = '';
83 + }
84 +
85 + return '/' . $this->controller->get_rest_base() . '/' . $endpoint_name;
86 + }
87 +
88 + /**
89 + * Register the endpoint.
90 + *
91 + * By default: register get items route.
92 + *
93 + * @throws \Exception If invalid endpoint registered.
94 + */
95 + protected function register() {
96 + $this->register_items_route();
97 + }
98 +
99 + /**
100 + * Register sub endpoint.
101 + *
102 + * @param string $route
103 + * @param string $endpoint_class
104 + *
105 + * @return \Elementor\Data\Base\SubEndpoint
106 + * @throws \Exception If invalid sub endpoint registered.
107 + */
108 + protected function register_sub_endpoint( $route, $endpoint_class ) {
109 + $endpoint_instance = new $endpoint_class( $route, $this );
110 +
111 + if ( ! ( $endpoint_instance instanceof SubEndpoint ) ) {
112 + throw new \Exception( 'Invalid endpoint instance.' );
113 + }
114 +
115 + $endpoint_route = $route . '/' . $endpoint_instance->get_name();
116 +
117 + $this->sub_endpoints[ $endpoint_route ] = $endpoint_instance;
118 +
119 + $component_name = $endpoint_instance->controller->get_rest_base();
120 + $parent_instance = $endpoint_instance->get_parent();
121 + $parent_name = $endpoint_instance->get_name();
122 + $parent_format_suffix = $parent_instance::get_format();
123 + $current_format_suffix = $endpoint_instance::get_format();
124 +
125 + $command = $component_name . '/' . $parent_name;
126 + $format = $component_name . '/' . $parent_format_suffix . '/' . $parent_name . '/' . $current_format_suffix;
127 +
128 + Manager::instance()->register_endpoint_format( $command, $format );
129 +
130 + return $endpoint_instance;
131 + }
132 +
133 + /**
134 + * Base callback.
135 + *
136 + * All reset requests from the client should pass this function.
137 + *
138 + * @param string $methods
139 + * @param \WP_REST_Request $request
140 + * @param bool $is_multi
141 + *
142 + * @return mixed|\WP_Error|\WP_HTTP_Response|\WP_REST_Response
143 + * @throws \Exception If invalid method.
144 + */
145 + public function base_callback( $methods, $request, $is_multi = false ) {
146 + // TODO: Find better solution.
147 + $json_params = $request->get_json_params();
148 +
149 + if ( $json_params ) {
150 + $request->set_body_params( $json_params );
151 + }
152 +
153 + // TODO: Handle permission callback.
154 + switch ( $methods ) {
155 + case WP_REST_Server::READABLE:
156 + $result = $is_multi ? $this->get_items( $request ) : $this->get_item( $request->get_param( 'id' ), $request );
157 + break;
158 +
159 + case WP_REST_Server::CREATABLE:
160 + $result = $is_multi ? $this->create_items( $request ) : $this->create_item( $request->get_param( 'id' ), $request );
161 + break;
162 +
163 + case WP_REST_Server::EDITABLE:
164 + $result = $is_multi ? $this->update_items( $request ) : $this->update_item( $request->get_param( 'id' ), $request );
165 + break;
166 +
167 + case WP_REST_Server::DELETABLE:
168 + $result = $is_multi ? $this->delete_items( $request ) : $this->delete_item( $request->get_param( 'id' ), $request );
169 + break;
170 +
171 + default:
172 + throw new \Exception( 'Invalid method.' );
173 + }
174 +
175 + return rest_ensure_response( $result );
176 + }
177 +
178 + /**
179 + * Retrieves a collection of items.
180 + *
181 + * @param \WP_REST_Request $request Full data about the request.
182 + *
183 + * @return \WP_Error|\WP_REST_Response Response object on success, or WP_Error object on failure.
184 + */
185 + public function get_items( $request ) {
186 + return $this->controller->get_items( $request );
187 + }
188 +
189 + /**
190 + * Retrieves one item from the collection.
191 + *
192 + * @param string $id
193 + * @param \WP_REST_Request $request Full data about the request.
194 + *
195 + * @return \WP_Error|\WP_REST_Response Response object on success, or WP_Error object on failure.
196 + */
197 + public function get_item( $id, $request ) {
198 + return $this->controller->get_item( $request );
199 + }
200 +
201 + /**
202 + * Get permission callback.
203 + *
204 + * By default get permission callback from the controller.
205 + *
206 + * @param \WP_REST_Request $request Full data about the request.
207 + *
208 + * @return boolean
209 + */
210 + public function get_permission_callback( $request ) {
211 + return $this->controller->get_permission_callback( $request );
212 + }
213 +
214 + /**
215 + * Creates one item.
216 + *
217 + * @param string $id id of request item.
218 + * @param \WP_REST_Request $request Full data about the request.
219 + *
220 + * @return \WP_Error|\WP_REST_Response Response object on success, or WP_Error object on failure.
221 + */
222 + public function create_item( $id, $request ) {
223 + return $this->controller->create_item( $request );
224 + }
225 +
226 + /**
227 + * Creates multiple items.
228 + *
229 + * @param \WP_REST_Request $request Full data about the request.
230 + *
231 + * @return \WP_Error|\WP_REST_Response Response object on success, or WP_Error object on failure.
232 + */
233 + public function create_items( $request ) {
234 + return $this->controller->create_items( $request );
235 + }
236 +
237 + /**
238 + * Updates one item.
239 + *
240 + * @param string $id id of request item.
241 + * @param \WP_REST_Request $request Full data about the request.
242 + *
243 + * @return \WP_Error|\WP_REST_Response Response object on success, or WP_Error object on failure.
244 + */
245 + public function update_item( $id, $request ) {
246 + return $this->controller->update_item( $request );
247 + }
248 +
249 + /**
250 + * Updates multiple items.
251 + *
252 + * @param \WP_REST_Request $request Full data about the request.
253 + *
254 + * @return \WP_Error|\WP_REST_Response Response object on success, or WP_Error object on failure.
255 + */
256 + public function update_items( $request ) {
257 + return $this->controller->update_items( $request );
258 + }
259 +
260 + /**
261 + * Delete one item.
262 + *
263 + * @param string $id id of request item.
264 + * @param \WP_REST_Request $request Full data about the request.
265 + *
266 + * @return \WP_Error|\WP_REST_Response Response object on success, or WP_Error object on failure.
267 + */
268 + public function delete_item( $id, $request ) {
269 + return $this->controller->delete_item( $request );
270 + }
271 +
272 + /**
273 + * Delete multiple items.
274 + *
275 + * @param \WP_REST_Request $request Full data about the request.
276 + *
277 + * @return \WP_Error|\WP_REST_Response Response object on success, or WP_Error object on failure.
278 + */
279 + public function delete_items( $request ) {
280 + return $this->controller->delete_items( $request );
281 + }
282 +
283 + /**
284 + * Register item route.
285 + *
286 + * @param string $methods
287 + * @param array $args
288 + * @param string $route
289 + *
290 + * @throws \Exception If invalid method.
291 + */
292 + public function register_item_route( $methods = WP_REST_Server::READABLE, $args = [], $route = '/' ) {
293 + $args = array_merge( [
294 + 'id' => [
295 + 'description' => 'Unique identifier for the object.',
296 + 'type' => 'string',
297 + ],
298 + ], $args );
299 +
300 + if ( isset( $args['id'] ) && $args['id'] ) {
301 + $route .= '(?P<id>[\w]+)/';
302 + }
303 +
304 + $this->register_route( $route, $methods, function ( $request ) use ( $methods ) {
305 + return $this->base_callback( $methods, $request );
306 + }, $args );
307 + }
308 +
309 + /**
310 + * Register items route.
311 + *
312 + * @param string $methods
313 + *
314 + * @throws \Exception If invalid method.
315 + */
316 + public function register_items_route( $methods = WP_REST_Server::READABLE ) {
317 + $this->register_route( '', $methods, function ( $request ) use ( $methods ) {
318 + return $this->base_callback( $methods, $request, true );
319 + } );
320 + }
321 +
322 + /**
323 + * Register route.
324 + *
325 + * @param string $route
326 + * @param string $methods
327 + * @param null $callback
328 + * @param array $args
329 + *
330 + * @return bool
331 + * @throws \Exception If invalid method.
332 + */
333 + public function register_route( $route = '', $methods = WP_REST_Server::READABLE, $callback = null, $args = [] ) {
334 + if ( ! in_array( $methods, self::AVAILABLE_METHODS, true ) ) {
335 + throw new \Exception( 'Invalid method.' );
336 + }
337 +
338 + $route = $this->get_base_route() . $route;
339 +
340 + return register_rest_route( $this->controller->get_namespace(), $route, [
341 + [
342 + 'args' => $args,
343 + 'methods' => $methods,
344 + 'callback' => $callback,
345 + 'permission_callback' => function ( $request ) {
346 + return $this->get_permission_callback( $request );
347 + },
348 + ],
349 + ] );
350 + }
351 + }
352 +