![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/mautic.corals.io/plugins/MauticCrmBundle/Api/ |
<?php namespace MauticPlugin\MauticCrmBundle\Api; use Mautic\PluginBundle\Exception\ApiErrorException; use MauticPlugin\MauticCrmBundle\Integration\ConnectwiseIntegration; /** * @property ConnectwiseIntegration $integration */ class ConnectwiseApi extends CrmApi { /** * @param string $endpoint * @param array $parameters * @param string $method * * @return mixed|string * * @throws ApiErrorException */ protected function request($endpoint, $parameters = [], $method = 'GET') { $apiUrl = $this->integration->getApiUrl(); $url = sprintf('%s/%s', $apiUrl, $endpoint); $response = $this->integration->makeRequest( $url, $parameters, $method, ['encode_parameters' => 'json'] ); $errors = []; $code = 0; if (is_array($response)) { foreach ($response as $key => $r) { $key = preg_replace('/[\r\n]+/', '', $key); switch ($key) { case '<!DOCTYPE_html_PUBLIC_"-//W3C//DTD_XHTML_1_0_Strict//EN"_"http://www_w3_org/TR/xhtml1/DTD/xhtml1-strict_dtd"><html_xmlns': $errors[] = '404 not found error'; $code = 404; break; case 'errors': $errors[] = $response['message']; // no break case 'code': $errors[] = $response['message']; break; } } } if (!empty($errors)) { throw new ApiErrorException(implode(' ', $errors), $code); } return $response; } /** * @param int $page * * @return mixed|string * * @throws ApiErrorException */ public function getCompanies(array $params, $page = 1) { $query = [ 'page' => $page, 'pageSize' => ConnectwiseIntegration::PAGESIZE, ]; $conditions = $params['conditions'] ?? []; if (isset($params['start'])) { $conditions[] = 'lastUpdated > ['.$params['start'].']'; } if ($conditions) { $query['conditions'] = implode(' AND ', $conditions); } return $this->request('company/companies', $query); } /** * @param int $page * * @return mixed|string * * @throws ApiErrorException */ public function getContacts(array $params, $page = 1) { $query = [ 'page' => $page, 'pageSize' => ConnectwiseIntegration::PAGESIZE, ]; if (isset($params['start'])) { $query['conditions'] = 'lastUpdated > ['.$params['start'].']'; } if (isset($params['Email'])) { $query['childconditions'] = 'communicationItems/value = "'.$params['Email'].'" AND communicationItems/communicationType="Email"'; } if (isset($params['Ids'])) { $query['conditions'] = 'id in ('.$params['Ids'].')'; } return $this->request('company/contacts', $query); } /** * @return mixed|string * * @throws ApiErrorException */ public function createContact(array $params) { return $this->request('company/contacts', $params, 'POST'); } /** * @return mixed|string * * @throws ApiErrorException */ public function updateContact(array $params, $id) { return $this->request('company/contacts/'.$id, $params, 'PATCH'); } /** * @throws ApiErrorException */ public function getCampaigns(): array { return $this->fetchAllRecords('marketing/groups'); } /** * @param int $page * * @return mixed|string * * @throws ApiErrorException */ public function getCampaignMembers($campaignId, $page = 1) { return $this->request('marketing/groups/'.$campaignId.'/contacts', ['page' => $page, 'pageSize' => ConnectwiseIntegration::PAGESIZE]); } /** * https://{connectwiseSite}/v4_6_release/apis/3.0/sales/activities/types. * * @throws ApiErrorException */ public function getActivityTypes(): array { return $this->fetchAllRecords('sales/activities/types'); } /** * @param array $params * * @return array * * @throws ApiErrorException */ public function postActivity($params = []) { return $this->request('sales/activities', $params, 'POST'); } /** * @throws ApiErrorException */ public function getMembers(): array { return $this->fetchAllRecords('system/members'); } /** * @throws ApiErrorException */ public function fetchAllRecords($endpoint): array { $page = 1; $pageSize = ConnectwiseIntegration::PAGESIZE; $allRecords = []; try { while ($pagedRecords = $this->request($endpoint, ['page' => $page, 'pageSize' => $pageSize])) { $allRecords = array_merge($allRecords, $pagedRecords); ++$page; if (count($pagedRecords) < $pageSize) { // Received less than page size so we know there are no more records to fetch break; } } } catch (ApiErrorException $exception) { if (404 !== $exception->getCode()) { // Ignore 404 due to pagination throw $exception; } } return $allRecords; } }