PluginProbe
ERP: Complete HR, Accounting & CRM Suite Built for WooCommerce / 1.2.6
ERP: Complete HR, Accounting & CRM Suite Built for WooCommerce v1.2.6
1.17.9 1.17.8 1.17.7 1.17.6 1.17.5 1.17.4 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.3.0 1.3.1 1.3.11 1.3.12 1.3.13 1.3.14 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 All 143 releases
erp / includes / api / class-contacts-groups-controller.php

class-contacts-groups-controller.php in ERP: Complete HR, Accounting & CRM Suite Built for WooCommerce 1.2.6, at includes/api/class-contacts-groups-controller.php

365 lines 11.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace WeDevs\ERP\API;
3
4 use WP_REST_Server;
5 use WP_REST_Response;
6 use WP_Error;
7
8 class Contacts_Groups_Controller extends REST_Controller {
9 /**
10 * Endpoint namespace.
11 *
12 * @var string
13 */
14 protected $namespace = 'erp/v1';
15
16 /**
17 * Route base.
18 *
19 * @var string
20 */
21 protected $rest_base = 'crm/contacts/groups';
22
23 /**
24 * Register the routes for the objects of the controller.
25 */
26 public function register_routes() {
27 register_rest_route( $this->namespace, '/' . $this->rest_base, [
28 [
29 'methods' => WP_REST_Server::READABLE,
30 'callback' => [ $this, 'get_groups' ],
31 'args' => $this->get_collection_params(),
32 'permission_callback' => function ( $request ) {
33 return current_user_can( 'erp_crm_manage_groups' );
34 },
35 ],
36 [
37 'methods' => WP_REST_Server::CREATABLE,
38 'callback' => [ $this, 'create_group' ],
39 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
40 'permission_callback' => function ( $request ) {
41 return current_user_can( 'erp_crm_create_groups' );
42 },
43 ],
44 'schema' => [ $this, 'get_public_item_schema' ],
45 ] );
46
47 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)', [
48 [
49 'methods' => WP_REST_Server::READABLE,
50 'callback' => [ $this, 'get_group' ],
51 'permission_callback' => function ( $request ) {
52 return current_user_can( 'erp_crm_manage_groups' );
53 },
54 ],
55 [
56 'methods' => WP_REST_Server::EDITABLE,
57 'callback' => [ $this, 'update_group' ],
58 'permission_callback' => function ( $request ) {
59 return current_user_can( 'erp_crm_create_groups' );
60 },
61 ],
62 [
63 'methods' => WP_REST_Server::DELETABLE,
64 'callback' => [ $this, 'delete_group' ],
65 'permission_callback' => function ( $request ) {
66 return current_user_can( 'erp_crm_delete_groups' );
67 },
68 ],
69 ] );
70
71 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)' . '/subscribes', [
72 [
73 'methods' => WP_REST_Server::READABLE,
74 'callback' => [ $this, 'get_subscribed_contacts' ],
75 'args' => $this->get_collection_params(),
76 'permission_callback' => function ( $request ) {
77 return current_user_can( 'erp_crm_manage_groups' );
78 },
79 ],
80 [
81 'methods' => WP_REST_Server::CREATABLE,
82 'callback' => [ $this, 'subscribe_contact' ],
83 'permission_callback' => function ( $request ) {
84 return current_user_can( 'erp_crm_manage_groups' );
85 },
86 ],
87 ] );
88
89 register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<group_id>[\d]+)' . '/subscribes' . '/(?P<contact_id>[\d]+)', [
90 [
91 'methods' => WP_REST_Server::DELETABLE,
92 'callback' => [ $this, 'delete_subscribed_contact' ],
93 'permission_callback' => function ( $request ) {
94 return current_user_can( 'erp_crm_manage_groups' );
95 },
96 ],
97 ] );
98 }
99
100 /**
101 * Get a collection of groups
102 *
103 * @param WP_REST_Request $request
104 *
105 * @return WP_Error|WP_REST_Response
106 */
107 public function get_groups( $request ) {
108 $args = [
109 'number' => $request['per_page'],
110 'offset' => ( $request['per_page'] * ( $request['page'] - 1 ) ),
111 ];
112
113 $items = erp_crm_get_contact_groups( $args );
114 $total_items = erp_crm_get_contact_groups( [ 'count' => true ] );
115
116 $formated_items = [];
117 foreach ( $items as $item ) {
118 $data = $this->prepare_item_for_response( $item, $request );
119 $formated_items[] = $this->prepare_response_for_collection( $data );
120 }
121
122 $response = rest_ensure_response( $formated_items );
123 $response = $this->format_collection_response( $response, $request, $total_items );
124
125 return $response;
126 }
127
128 /**
129 * Get a specific group
130 *
131 * @param WP_REST_Request $request
132 *
133 * @return WP_Error|WP_REST_Response
134 */
135 public function get_group( $request ) {
136 $id = (int) $request['id'];
137 $item = (object) erp_crm_get_contact_group_by_id( $id );
138
139 if ( empty( $id ) || empty( $item->id ) ) {
140 return new WP_Error( 'rest_group_invalid_id', __( 'Invalid resource id.' ), [ 'status' => 404 ] );
141 }
142
143 $item = $this->prepare_item_for_response( $item, $request );
144 $response = rest_ensure_response( $item );
145
146 return $response;
147 }
148
149 /**
150 * Create a group
151 *
152 * @param WP_REST_Request $request
153 *
154 * @return WP_Error|WP_REST_Request
155 */
156 public function create_group( $request ) {
157 $data = [
158 'name' => $request['name'],
159 'description' => $request['description'],
160 ];
161
162 $group = erp_crm_save_contact_group( $data );
163
164 return new WP_REST_Response( $group, 201 );
165 }
166
167 /**
168 * Update a group
169 *
170 * @param WP_REST_Request $request
171 *
172 * @return WP_Error|WP_REST_Request
173 */
174 public function update_group( $request ) {
175 $data = [
176 'id' => intval( $request['id'] ),
177 'name' => $request['name'],
178 'description' => $request['description'],
179 ];
180
181 $group = erp_crm_save_contact_group( $data );
182
183 return new WP_REST_Response( $group_id, 201 );
184 }
185
186 /**
187 * Delete a group
188 *
189 * @param WP_REST_Request $request
190 *
191 * @return WP_Error|WP_REST_Request
192 */
193 public function delete_group( $request ) {
194 $group_id = (int) $request['id'];
195
196 erp_crm_contact_group_delete( $group_id );
197
198 return new WP_REST_Response( true, 204 );
199 }
200
201 /**
202 * Get a collection of subscribed contacts
203 *
204 * @param WP_REST_Request $request
205 *
206 * @return WP_Error|WP_REST_Response
207 */
208 public function get_subscribed_contacts( $request ) {
209 $args = [
210 'group_id' => intval( $request['id'] ),
211 'number' => $request['per_page'],
212 'offset' => ( $request['per_page'] * ( $request['page'] - 1 ) ),
213 ];
214
215 $subscribers = erp_crm_get_subscriber_contact( $args );
216 $args['count'] = true;
217 $total_items = erp_crm_get_subscriber_contact( $args );
218
219 $item_ids = [];
220 foreach ( $subscribers as $subscriber ) {
221 $item_ids[] = $subscriber->user_id;
222 }
223
224 $items = [];
225 if ( ! empty( $item_ids ) ) {
226 $items = erp_get_people_by( 'id', $item_ids );
227 }
228
229 $contacts_controller = new Contacts_Controller();
230
231 $formated_items = [];
232 foreach ( $items as $item ) {
233 $data = $contacts_controller->prepare_item_for_response( $item, $request );
234 $formated_items[] = $this->prepare_response_for_collection( $data );
235 }
236
237 $response = rest_ensure_response( $formated_items );
238 $response = $this->format_collection_response( $response, $request, $total_items );
239
240 return $response;
241 }
242
243 /**
244 * Subscribe a contact to a group
245 *
246 * @param WP_REST_Request $request
247 *
248 * @return WP_Error|WP_REST_Request
249 */
250 public function subscribe_contact( $request ) {
251 if ( ! isset( $request['contact_ids'] ) || empty( $request['contact_ids'] ) ) {
252 return new WP_Error( 'rest_group_invalid_contact_ids', __( 'Required contact ids.' ), [ 'status' => 400 ] );
253 }
254
255 $contact_ids = explode( ',', str_replace( ' ', '', $request['contact_ids'] ) );
256
257 foreach ( $contact_ids as $contact_id ) {
258 $data = [
259 'group_id' => intval( $request['id'] ),
260 'user_id' => intval( $contact_id ),
261 ];
262
263 $result = erp_crm_create_new_contact_subscriber( $data );
264 }
265
266 return new WP_REST_Response( true, 201 );
267 }
268
269 /**
270 * Unsubscribe a contact from a group
271 *
272 * @param WP_REST_Request $request
273 *
274 * @return WP_Error|WP_REST_Request
275 */
276 public function delete_subscribed_contact( $request ) {
277 $contact_id = intval( $request['contact_id'] );
278 $group_id = intval( $request['group_id'] );
279
280 erp_crm_contact_subscriber_delete( $contact_id, $group_id );
281
282 return new WP_REST_Response( true, 204 );
283 }
284
285 /**
286 * Prepare a single item for create or update
287 *
288 * @param WP_REST_Request $request Request object.
289 *
290 * @return array $prepared_item
291 */
292 protected function prepare_item_for_database( $request ) {
293 $prepared_item = [];
294
295 // required arguments.
296 if ( isset( $request['name'] ) ) {
297 $prepared_item['name'] = $request['name'];
298 }
299 if ( isset( $request['description'] ) ) {
300 $prepared_item['description'] = $request['description'];
301 }
302
303 // optional arguments.
304 if ( isset( $request['id'] ) ) {
305 $prepared_item['id'] = absint( $request['id'] );
306 }
307
308 return $prepared_item;
309 }
310
311 /**
312 * Prepare a single user output for response
313 *
314 * @param object $item
315 * @param WP_REST_Request $request Request object.
316 *
317 * @return WP_REST_Response $response Response data.
318 */
319 public function prepare_item_for_response( $item, $request ) {
320 $data = [
321 'id' => (int) $item->id,
322 'name' => $item->name,
323 'description' => $item->description,
324 ];
325
326 // Wrap the data in a response object
327 $response = rest_ensure_response( $data );
328
329 $response = $this->add_links( $response, $item );
330
331 return $response;
332 }
333
334 /**
335 * Get the User's schema, conforming to JSON Schema
336 *
337 * @return array
338 */
339 public function get_item_schema() {
340 $schema = [
341 '$schema' => 'http://json-schema.org/draft-04/schema#',
342 'title' => 'contact group',
343 'type' => 'object',
344 'properties' => [
345 'id' => [
346 'description' => __( 'Unique identifier for the resource.' ),
347 'type' => 'integer',
348 'context' => [ 'embed', 'view', 'edit' ],
349 'readonly' => true,
350 ],
351 'name' => [
352 'description' => __( 'Name for the resource.' ),
353 'type' => 'string',
354 'context' => [ 'edit' ],
355 'arg_options' => [
356 'sanitize_callback' => 'sanitize_text_field',
357 ],
358 'required' => true,
359 ],
360 ],
361 ];
362
363 return $schema;
364 }
365 }