3, 'check_permissions' => TRUE], $request[2] ?? []); switch ($this->apiError) { case 'array': return civicrm_api(...$request); case 'exception': return civicrm_api3(...$request); default: throw new \CRM_Core_Exception("Invalid API error-handling mode: $this->apiError"); } } /** * Send a request to APIv4. * * @param $session * @param array $request * Tuple: [$entity, $action, $params] * @return array|\Civi\Api4\Generic\Result|int */ public function api4($session, $request) { $request[2] = array_merge(['version' => 4, 'checkPermissions' => TRUE], $request[2] ?? []); switch ($this->apiError) { case 'array': return civicrm_api(...$request); case 'exception': return civicrm_api4(...$request); default: throw new \CRM_Core_Exception("Invalid API error-handling mode: $this->apiError"); } } /** * Simple test; send/receive a fragment of data. * * @param $session * @param mixed $request * @return mixed */ public function echo($session, $request) { return $request; } /** * Set active user. * * @param $session * @param array{contactId: int, userId: int, user: string} $request * @return array|\Civi\Api4\Generic\Result|int */ public function login($session, $request) { if (!function_exists('authx_login')) { throw new \CRM_Core_Exception("Cannot authenticate. Authx is not configured."); } $auth = authx_login($request, FALSE /* Pipe sessions do not need cookies or DB */); return \CRM_Utils_Array::subset($auth, ['contactId', 'userId']); } /** * Set ephemeral session options. * * @param $session * @param array{maxLines: int, responsePrefix: int} $request * Any updates to perform. May be empty/omitted. * @return array{maxLines: int, responsePrefix: int} * List of updated options. * If the list of updates was empty, then return all options. */ public function options($session, $request) { $storageMap = [ 'apiError' => $this, 'maxLine' => $session, 'responsePrefix' => $session, ]; $get = function($storage, $name) { if (method_exists($storage, 'get' . ucfirst($name))) { return $storage->{'get' . ucfirst($name)}(); } else { return $storage->{$name}; } }; $set = function($storage, $name, $value) use ($get) { if (method_exists($storage, 'set' . ucfirst($name))) { $storage->{'set' . ucfirst($name)}($value); } else { $storage->{$name} = $value; } return $get($storage, $name); }; $result = []; if (!empty($request)) { foreach ($request as $name => $value) { if (isset($storageMap[$name])) { $result[$name] = $set($storageMap[$name], $name, $value); } } } else { foreach ($storageMap as $name => $storage) { $result[$name] = $get($storage, $name); } } return $result; } }