PluginProbe
Elementor Website Builder – more than just a page builder / 3.29.2
Elementor Website Builder – more than just a page builder v3.29.2
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
elementor / modules / global-classes / global-classes-rest-api.php

global-classes-rest-api.php in Elementor Website Builder – more than just a page builder 3.29.2, at modules/global-classes/global-classes-rest-api.php

175 lines 4.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Elementor\Modules\GlobalClasses;
4
5 use Elementor\Modules\GlobalClasses\Utils\Error_Builder;
6 use Elementor\Modules\GlobalClasses\Utils\Response_Builder;
7
8 if ( ! defined( 'ABSPATH' ) ) {
9 exit; // Exit if accessed directly.
10 }
11
12 class Global_Classes_REST_API {
13 const API_NAMESPACE = 'elementor/v1';
14 const API_BASE = 'global-classes';
15
16 const MAX_ITEMS = 50;
17
18 private $repository = null;
19
20 public function register_hooks() {
21 add_action( 'rest_api_init', fn() => $this->register_routes() );
22 }
23
24 private function get_repository() {
25 if ( ! $this->repository ) {
26 $this->repository = new Global_Classes_Repository();
27 }
28
29 return $this->repository;
30 }
31
32 private function register_routes() {
33 register_rest_route( self::API_NAMESPACE, '/' . self::API_BASE, [
34 [
35 'methods' => 'GET',
36 'callback' => fn( $request ) => $this->route_wrapper( fn() => $this->all( $request ) ),
37 'permission_callback' => fn() => current_user_can( 'manage_options' ),
38 'args' => [
39 'context' => [
40 'type' => 'string',
41 'required' => false,
42 'default' => Global_Classes_Repository::CONTEXT_FRONTEND,
43 'enum' => [
44 Global_Classes_Repository::CONTEXT_FRONTEND,
45 Global_Classes_Repository::CONTEXT_PREVIEW,
46 ],
47 ],
48 ],
49 ],
50 ] );
51
52 register_rest_route( self::API_NAMESPACE, '/' . self::API_BASE, [
53 [
54 'methods' => 'PUT',
55 'callback' => fn( $request ) => $this->route_wrapper( fn() => $this->put( $request ) ),
56 'permission_callback' => fn() => current_user_can( 'manage_options' ),
57 'args' => [
58 'context' => [
59 'type' => 'string',
60 'required' => false,
61 'default' => Global_Classes_Repository::CONTEXT_FRONTEND,
62 'enum' => [
63 Global_Classes_Repository::CONTEXT_FRONTEND,
64 Global_Classes_Repository::CONTEXT_PREVIEW,
65 ],
66 ],
67 'items' => [
68 'required' => true,
69 'type' => 'object',
70 'additionalProperties' => [
71 'type' => 'object',
72 'properties' => [
73 'id' => [
74 'type' => 'string',
75 'required' => true,
76 ],
77 'variants' => [
78 'type' => 'array',
79 'required' => true,
80 ],
81 'type' => [
82 'type' => 'string',
83 'enum' => [ 'class' ],
84 'required' => true,
85 ],
86 'label' => [
87 'type' => 'string',
88 'required' => true,
89 ],
90 ],
91 ],
92 ],
93 'order' => [
94 'required' => true,
95 'type' => 'array',
96 'items' => [
97 'type' => 'string',
98 ],
99 ],
100 ],
101 ],
102 ] );
103 }
104
105 private function all( \WP_REST_Request $request ) {
106 $context = $request->get_param( 'context' );
107
108 $classes = $this->get_repository()->context( $context )->all();
109
110 return Response_Builder::make( (object) $classes->get_items()->all() )
111 ->set_meta( [ 'order' => $classes->get_order()->all() ] )
112 ->build();
113 }
114
115 private function put( \WP_REST_Request $request ) {
116 $parser = Global_Classes_Parser::make();
117
118 $items_result = $parser->parse_items(
119 $request->get_param( 'items' )
120 );
121
122 $items_count = count( $items_result->unwrap() );
123
124 if ( $items_count >= static::MAX_ITEMS ) {
125 return Error_Builder::make( 'global_classes_limit_exceeded' )
126 ->set_status( 400 )
127 ->set_message( sprintf(
128 __( 'Global classes limit exceeded. Maximum allowed: %d', 'elementor' ),
129 static::MAX_ITEMS
130 ) )
131 ->build();
132 }
133
134 if ( ! $items_result->is_valid() ) {
135 return Error_Builder::make( 'invalid_items' )
136 ->set_status( 400 )
137 ->set_message( 'Invalid items: ' . $items_result->errors()->to_string() )
138 ->build();
139 }
140
141 $order_result = $parser->parse_order(
142 $request->get_param( 'order' ),
143 $items_result->unwrap()
144 );
145
146 if ( ! $order_result->is_valid() ) {
147 return Error_Builder::make( 'invalid_order' )
148 ->set_status( 400 )
149 ->set_message( 'Invalid order: ' . $order_result->errors()->to_string() )
150 ->build();
151 }
152
153 $context = $request->get_param( 'context' );
154
155 $this->get_repository()->context( $context )->put(
156 $items_result->unwrap(),
157 $order_result->unwrap(),
158 );
159
160 return Response_Builder::make()->no_content()->build();
161 }
162
163 private function route_wrapper( callable $cb ) {
164 try {
165 $response = $cb();
166 } catch ( \Exception $e ) {
167 return Error_Builder::make( 'unexpected_error' )
168 ->set_message( __( 'Something went wrong', 'elementor' ) )
169 ->build();
170 }
171
172 return $response;
173 }
174 }
175