PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.21.13
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.21.13
V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 2.10.2 All 137 releases
bit-form / includes / Core / Integration / ZohoAnalytics / ZohoAnalyticsHandler.php

ZohoAnalyticsHandler.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 2.21.13, at includes/Core/Integration/ZohoAnalytics/ZohoAnalyticsHandler.php

538 lines 18.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * ZohoAnalytics Integration
5 *
6 */
7
8 namespace BitCode\BitForm\Core\Integration\ZohoAnalytics;
9
10 if (!defined('ABSPATH')) {
11 exit;
12 }
13
14 use BitCode\BitForm\Core\Integration\IntegrationHandler;
15 use BitCode\BitForm\Core\Util\ApiResponse as UtilApiResponse;
16 use BitCode\BitForm\Core\Util\HttpHelper;
17 use BitCode\BitForm\Core\Util\IpTool;
18 use BitCode\BitForm\GlobalHelper;
19 use WP_Error;
20
21 /**
22 * Provide functionality for ZohoCrm integration
23 */
24 class ZohoAnalyticsHandler
25 {
26 private $_formID;
27 private $_integrationID;
28
29 private $_logResponse;
30
31 public function __construct($integrationID, $fromID)
32 {
33 $this->_formID = $fromID;
34 $this->_integrationID = $integrationID;
35 $this->_logResponse = new UtilApiResponse();
36 }
37
38 /**
39 * Helps to register ajax function's with wp
40 *
41 * @return null
42 */
43 public static function registerAjax()
44 {
45 add_action('wp_ajax_bitforms_zanalytics_generate_token', [__CLASS__, 'generateTokens']);
46 add_action('wp_ajax_bitforms_zanalytics_refresh_workspaces', [__CLASS__, 'refreshWorkspacesAjaxHelper']);
47 add_action('wp_ajax_bitforms_zanalytics_refresh_users', [__CLASS__, 'refreshUsersAjaxHelper']);
48 add_action('wp_ajax_bitforms_zanalytics_refresh_tables', [__CLASS__, 'refreshTablesAjaxHelper']);
49 add_action('wp_ajax_bitforms_zanalytics_refresh_table_headers', [__CLASS__, 'refreshTableHeadersAjaxHelper']);
50 }
51
52 /**
53 * Process ajax request for generate_token
54 *
55 * @return JSON zoho crm api response and status
56 */
57 public static function generateTokens()
58 {
59 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
60
61 GlobalHelper::requirePostMethod();
62
63 try {
64 $requestsParams = GlobalHelper::formatRequestData();
65 } catch (\InvalidArgumentException $e) {
66 wp_send_json_error($e->getMessage(), 400);
67 }
68
69 if (
70 empty($requestsParams->{'accounts-server'})
71 || empty($requestsParams->dataCenter)
72 || empty($requestsParams->clientId)
73 || empty($requestsParams->clientSecret)
74 || empty($requestsParams->redirectURI)
75 || empty($requestsParams->code)
76 ) {
77 wp_send_json_error(
78 __(
79 'Requested parameter is empty',
80 'bit-form'
81 ),
82 400
83 );
84 }
85
86 $apiEndpoint = \urldecode($requestsParams->{'accounts-server'}) . '/oauth/v2/token';
87 $requestParams = [
88 'grant_type' => 'authorization_code',
89 'client_id' => $requestsParams->clientId,
90 'client_secret' => $requestsParams->clientSecret,
91 'redirect_uri' => \urldecode($requestsParams->redirectURI),
92 'code' => $requestsParams->code
93 ];
94 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
95
96 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
97 wp_send_json_error(
98 empty($apiResponse->error) ? 'Unknown' : $apiResponse->error,
99 400
100 );
101 }
102 $apiResponse->generates_on = \time();
103 wp_send_json_success($apiResponse, 200);
104 } else {
105 wp_send_json_error(
106 __(
107 'Token expired',
108 'bit-form'
109 ),
110 401
111 );
112 }
113 }
114
115 /**
116 * Process ajax request for refresh crm modules
117 *
118 * @return JSON crm module data
119 */
120 public static function refreshWorkspacesAjaxHelper()
121 {
122 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
123 $authorizationHeader = null;
124
125 GlobalHelper::requirePostMethod();
126
127 try {
128 $queryParams = GlobalHelper::formatRequestData();
129 } catch (\InvalidArgumentException $e) {
130 wp_send_json_error($e->getMessage(), 400);
131 }
132 if (
133 empty($queryParams->tokenDetails)
134 || empty($queryParams->dataCenter)
135 || empty($queryParams->clientId)
136 || empty($queryParams->clientSecret)
137 || empty($queryParams->ownerEmail)
138 ) {
139 wp_send_json_error(
140 __(
141 'Requested parameter is empty',
142 'bit-form'
143 ),
144 400
145 );
146 }
147 $response = [];
148 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
149 $response['tokenDetails'] = ZohoAnalyticsHandler::_refreshAccessToken($queryParams);
150 }
151
152 $workspacesMetaApiEndpoint = "https://analyticsapi.zoho.{$queryParams->dataCenter}/api/{$queryParams->ownerEmail}?ZOHO_ACTION=MYWORKSPACELIST&ZOHO_OUTPUT_FORMAT=JSON&ZOHO_ERROR_FORMAT=JSON&ZOHO_API_VERSION=1.0";
153
154 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
155 $workspacesMetaResponse = HttpHelper::get($workspacesMetaApiEndpoint, null, $authorizationHeader);
156
157 $allWorkspaces = [];
158 if (!is_wp_error($workspacesMetaResponse) && empty($workspacesMetaResponse->response->error)) {
159 $workspaces = $workspacesMetaResponse->response->result;
160 foreach ($workspaces as $workspace) {
161 $allWorkspaces[] = $workspace->workspaceName;
162 }
163 usort($allWorkspaces, 'strnatcasecmp');
164 $response['workspaces'] = $allWorkspaces;
165 } else {
166 wp_send_json_error(
167 $workspacesMetaResponse->response->error->message,
168 400
169 );
170 }
171 if (!empty($response['tokenDetails']) && !empty($queryParams->id)) {
172 ZohoAnalyticsHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response['workspaces']);
173 }
174 wp_send_json_success($response, 200);
175 } else {
176 wp_send_json_error(
177 __(
178 'Token expired',
179 'bit-form'
180 ),
181 401
182 );
183 }
184 }
185
186 public static function refreshUsersAjaxHelper()
187 {
188 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
189 $authorizationHeader = null;
190
191
192 GlobalHelper::requirePostMethod();
193
194 try {
195 $queryParams = GlobalHelper::formatRequestData();
196 } catch (\InvalidArgumentException $e) {
197 wp_send_json_error($e->getMessage(), 400);
198 }
199
200 if (
201 empty($queryParams->tokenDetails)
202 || empty($queryParams->dataCenter)
203 || empty($queryParams->clientId)
204 || empty($queryParams->clientSecret)
205 || empty($queryParams->ownerEmail)
206 ) {
207 wp_send_json_error(
208 __(
209 'Requested parameter is empty',
210 'bit-form'
211 ),
212 400
213 );
214 }
215 $response = [];
216 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
217 $response['tokenDetails'] = ZohoAnalyticsHandler::_refreshAccessToken($queryParams);
218 }
219
220 $usersMetaApiEndpoint = "https://analyticsapi.zoho.{$queryParams->dataCenter}/api/{$queryParams->ownerEmail}?ZOHO_ACTION=GETUSERS&ZOHO_OUTPUT_FORMAT=JSON&ZOHO_ERROR_FORMAT=JSON&ZOHO_API_VERSION=1.0";
221
222 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
223 $usersMetaResponse = HttpHelper::get($usersMetaApiEndpoint, null, $authorizationHeader);
224
225 $allusers = [];
226 if (!is_wp_error($usersMetaResponse) && empty($usersMetaResponse->response->error)) {
227 $users = $usersMetaResponse->response->result;
228 foreach ($users as $user) {
229 $allusers[] = $user->emailId;
230 }
231 usort($allusers, 'strnatcasecmp');
232 $response['users'] = $allusers;
233 } else {
234 wp_send_json_error(
235 $usersMetaResponse->response->error->message,
236 400
237 );
238 }
239 if (!empty($response['tokenDetails']) && !empty($queryParams->id)) {
240 ZohoAnalyticsHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response['users']);
241 }
242 wp_send_json_success($response, 200);
243 } else {
244 wp_send_json_error(
245 __(
246 'Token expired',
247 'bit-form'
248 ),
249 401
250 );
251 }
252 }
253
254 /**
255 * Process ajax request for refesh crm layouts
256 *
257 * @return JSON crm layout data
258 */
259 public static function refreshTablesAjaxHelper()
260 {
261 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
262 $authorizationHeader = null;
263
264
265 GlobalHelper::requirePostMethod();
266
267 try {
268 $queryParams = GlobalHelper::formatRequestData();
269 } catch (\InvalidArgumentException $e) {
270 wp_send_json_error($e->getMessage(), 400);
271 }
272 if (
273 empty($queryParams->workspace)
274 || empty($queryParams->tokenDetails)
275 || empty($queryParams->dataCenter)
276 || empty($queryParams->clientId)
277 || empty($queryParams->clientSecret)
278 ) {
279 wp_send_json_error(
280 __(
281 'Requested parameter is empty',
282 'bit-form'
283 ),
284 400
285 );
286 }
287 $response = [];
288 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
289 $response['tokenDetails'] = ZohoAnalyticsHandler::_refreshAccessToken($queryParams);
290 }
291
292 $tablesMetaApiEndpoint = "https://analyticsapi.zoho.{$queryParams->dataCenter}/api/{$queryParams->ownerEmail}/{$queryParams->workspace}?ZOHO_ACTION=VIEWLIST&ZOHO_OUTPUT_FORMAT=JSON&ZOHO_ERROR_FORMAT=JSON&ZOHO_API_VERSION=1.0";
293
294 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
295 $tablesMetaResponse = HttpHelper::get($tablesMetaApiEndpoint, null, $authorizationHeader);
296
297 $allTables = [];
298 if (!is_wp_error($tablesMetaResponse)) {
299 $tables = $tablesMetaResponse->response->result;
300 foreach ($tables as $table) {
301 if ('Table' === $table->viewType) {
302 $allTables[] = $table->viewName;
303 }
304 }
305 usort($allTables, 'strnatcasecmp');
306 $response['tables'] = $allTables;
307 } else {
308 wp_send_json_error(
309 'error' === $fieldsMetaResponse->status ? $fieldsMetaResponse->message : 'Unknown',
310 400
311 );
312 }
313 if (!empty($response['tokenDetails']) && $response['tokenDetails'] && !empty($queryParams->id)) {
314 $response['queryWorkspace'] = $queryParams->workspace;
315 ZohoAnalyticsHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response);
316 }
317 wp_send_json_success($response, 200);
318 } else {
319 wp_send_json_error(
320 __(
321 'Token expired',
322 'bit-form'
323 ),
324 401
325 );
326 }
327 }
328
329 /**
330 * Process ajax request for refesh crm layouts
331 *
332 * @return JSON crm layout data
333 */
334 public static function refreshTableHeadersAjaxHelper()
335 {
336 if (isset($_REQUEST['_ajax_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_REQUEST['_ajax_nonce'])), 'bitforms_save')) {
337 $authorizationHeader = null;
338
339
340 GlobalHelper::requirePostMethod();
341 try {
342 $queryParams = GlobalHelper::formatRequestData();
343 } catch (\InvalidArgumentException $e) {
344 wp_send_json_error($e->getMessage(), 400);
345 }
346 if (
347 empty($queryParams->workspace)
348 || empty($queryParams->table)
349 || empty($queryParams->tokenDetails)
350 || empty($queryParams->dataCenter)
351 || empty($queryParams->clientId)
352 || empty($queryParams->clientSecret)
353 ) {
354 wp_send_json_error(
355 __(
356 'Requested parameter is empty',
357 'bit-form'
358 ),
359 400
360 );
361 }
362 $response = [];
363 if ((intval($queryParams->tokenDetails->generates_on) + (55 * 60)) < time()) {
364 $response['tokenDetails'] = ZohoAnalyticsHandler::_refreshAccessToken($queryParams);
365 }
366
367 $tableHeadersMetaApiEndpoint = "https://analyticsapi.zoho.{$queryParams->dataCenter}/api/{$queryParams->ownerEmail}/{$queryParams->workspace}/{$queryParams->table}?ZOHO_ACTION=EXPORT&ZOHO_OUTPUT_FORMAT=JSON&ZOHO_ERROR_FORMAT=JSON&ZOHO_API_VERSION=1.0";
368
369 $authorizationHeader['Authorization'] = "Zoho-oauthtoken {$queryParams->tokenDetails->access_token}";
370 $tableHeadersMetaResponse = HttpHelper::get($tableHeadersMetaApiEndpoint, null, $authorizationHeader);
371
372 if ('string' === gettype($tableHeadersMetaResponse)) {
373 $tableHeadersMetaResponse = json_decode(preg_replace("/\\\'/", "'", $tableHeadersMetaResponse));
374 }
375
376 if (!is_wp_error($tableHeadersMetaResponse)) {
377 $allHeaders = array_diff($tableHeadersMetaResponse->response->result->column_order, ['Auto Number']);
378 usort($allHeaders, 'strnatcasecmp');
379 $response['table_headers'] = $allHeaders;
380 } else {
381 wp_send_json_error(
382 'error' === $tableHeadersMetaResponse->status ? $tableHeadersMetaResponse->message : 'Unknown',
383 400
384 );
385 }
386 if (!empty($response['tokenDetails']) && $response['tokenDetails'] && !empty($queryParams->id)) {
387 $response['queryModule'] = $queryParams->module;
388 ZohoAnalyticsHandler::_saveRefreshedToken($queryParams->formID, $queryParams->id, $response['tokenDetails'], $response);
389 }
390 wp_send_json_success($response, 200);
391 } else {
392 wp_send_json_error(
393 __(
394 'Token expired',
395 'bit-form'
396 ),
397 401
398 );
399 }
400 }
401
402 /**
403 * Helps to refresh zoho crm access_token
404 *
405 * @param object $apiData Contains required data for refresh access token
406 * @return string|boolean $tokenDetails API token details
407 */
408 protected static function _refreshAccessToken($apiData)
409 {
410 if (
411 empty($apiData->dataCenter)
412 || empty($apiData->clientId)
413 || empty($apiData->clientSecret)
414 || empty($apiData->tokenDetails)
415 ) {
416 return false;
417 }
418 $tokenDetails = $apiData->tokenDetails;
419
420 $dataCenter = $apiData->dataCenter;
421 $apiEndpoint = "https://accounts.zoho.{$dataCenter}/oauth/v2/token";
422 $requestParams = [
423 'grant_type' => 'refresh_token',
424 'client_id' => $apiData->clientId,
425 'client_secret' => $apiData->clientSecret,
426 'refresh_token' => $tokenDetails->refresh_token,
427 ];
428
429 $apiResponse = HttpHelper::post($apiEndpoint, $requestParams);
430 if (is_wp_error($apiResponse) || !empty($apiResponse->error)) {
431 return false;
432 }
433 $tokenDetails->generates_on = \time();
434 $tokenDetails->access_token = $apiResponse->access_token;
435 return $tokenDetails;
436 }
437
438 /**
439 * Save updated access_token to avoid unnecessary token generation
440 *
441 * @param Integer $fromID ID of Integration related form
442 * @param Integer $integrationID ID of Zoho crm Integration
443 * @param Obeject $tokenDetails refreshed token info
444 *
445 * @return null
446 */
447 protected static function _saveRefreshedToken($formID, $integrationID, $tokenDetails, $others = null)
448 {
449 if (empty($formID) || empty($integrationID)) {
450 return;
451 }
452
453 $integrationHandler = new IntegrationHandler($formID, IpTool::getUserDetail());
454 $zanalyticsDetails = $integrationHandler->getAIntegration($integrationID);
455
456 if (is_wp_error($zanalyticsDetails)) {
457 return;
458 }
459 $newDetails = json_decode($zanalyticsDetails[0]->integration_details);
460
461 $newDetails->tokenDetails = $tokenDetails;
462 if (!empty($others['workspaces'])) {
463 $newDetails->default->workspaces = $others['workspaces'];
464 }
465 if (!empty($others['tables'])) {
466 $newDetails->default->tables = $others['tables'];
467 }
468 if (!empty($others['table_headers'])) {
469 $newDetails->default->tables->headers->{$others['table']} = $others['table_headers'];
470 }
471
472 $integrationHandler->updateIntegration($integrationID, $zanalyticsDetails[0]->integration_name, 'Zoho Analytics', wp_json_encode($newDetails), 'form');
473 }
474
475 public function execute(IntegrationHandler $integrationHandler, $integrationData, $fieldValues, $entryID, $logID)
476 {
477 $integrationDetails = is_string($integrationData->integration_details) ? json_decode($integrationData->integration_details) : $integrationData->integration_details;
478
479 $tokenDetails = $integrationDetails->tokenDetails;
480 $workspace = $integrationDetails->workspace;
481 $table = $integrationDetails->table;
482 $ownerEmail = $integrationDetails->ownerEmail;
483 $dataCenter = $integrationDetails->dataCenter;
484 $fieldMap = $integrationDetails->field_map;
485 $actions = $integrationDetails->actions;
486 $defaultDataConf = $integrationDetails->default;
487
488 $entryDetails = [
489 'formId' => $this->_formID,
490 'entryId' => $entryID,
491 'fieldValues' => $fieldValues
492 ];
493
494 if (
495 empty($tokenDetails)
496 || empty($workspace)
497 || empty($table)
498 || empty($fieldMap)
499 ) {
500 $error = new WP_Error('REQ_FIELD_EMPTY', __('workspace, table, fields are required for zoho analytics api', 'bit-form'));
501 $this->_logResponse->apiResponse($logID, $this->_integrationID, 'record', 'validation', $error, $entryDetails);
502 return $error;
503 }
504
505 $requiredParams = null;
506 if ((intval($tokenDetails->generates_on) + (55 * 60)) < time()) {
507 $requiredParams['clientId'] = $integrationDetails->clientId;
508 $requiredParams['clientSecret'] = $integrationDetails->clientSecret;
509 $requiredParams['dataCenter'] = $integrationDetails->dataCenter;
510 $requiredParams['tokenDetails'] = $tokenDetails;
511 $newTokenDetails = ZohoAnalyticsHandler::_refreshAccessToken((object)$requiredParams);
512 if ($newTokenDetails) {
513 ZohoAnalyticsHandler::_saveRefreshedToken($this->_formID, $this->_integrationID, $newTokenDetails);
514 $tokenDetails = $newTokenDetails;
515 }
516 }
517
518 // $actions = $integrationDetails->actions;
519 $recordApiHelper = new RecordApiHelper($tokenDetails, $this->_integrationID, $logID, $this->_formID, $entryID);
520
521 $zanalyticsApiResponse = $recordApiHelper->executeRecordApi(
522 $workspace,
523 $table,
524 $ownerEmail,
525 $dataCenter,
526 $actions,
527 $defaultDataConf,
528 $fieldValues,
529 $fieldMap
530 );
531
532 if (is_wp_error($zanalyticsApiResponse)) {
533 return $zanalyticsApiResponse;
534 }
535 return $zanalyticsApiResponse;
536 }
537 }
538