PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 2.0
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v2.0
3.3.1 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 All 138 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.0, at includes/Core/Integration/ZohoAnalytics/ZohoAnalyticsHandler.php

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