264 lines
9.1 KiB
PHP
264 lines
9.1 KiB
PHP
<?php
|
|
|
|
namespace CommonConnectorTools;
|
|
use Cake\ORM\Locator\LocatorAwareTrait;
|
|
use Cake\Log\Log;
|
|
use Cake\Log\Engine\FileLog;
|
|
use Cake\Utility\Hash;
|
|
|
|
|
|
class CommonConnectorTools
|
|
{
|
|
public $description = '';
|
|
public $name = '';
|
|
public $connectorName = '';
|
|
public $exposedFunctions = [
|
|
'diagnostics'
|
|
];
|
|
public $version = '???';
|
|
|
|
const STATE_INITIAL = 'Request issued';
|
|
const STATE_ACCEPT = 'Request accepted';
|
|
const STATE_CONNECTED = 'Connected';
|
|
const STATE_SENDING_ERROR = 'Error while sending request';
|
|
const STATE_CANCELLED = 'Request cancelled';
|
|
const STATE_DECLINED = 'Request declined by remote';
|
|
|
|
public function __construct()
|
|
{
|
|
if (empty(Log::getConfig("LocalToolDebug{$this->connectorName}"))) {
|
|
Log::setConfig("LocalToolDebug{$this->connectorName}", [
|
|
'className' => FileLog::class,
|
|
'path' => LOGS,
|
|
'file' => "{$this->connectorName}-debug",
|
|
'scopes' => [$this->connectorName],
|
|
'levels' => ['notice', 'info', 'debug'],
|
|
]);
|
|
}
|
|
if (empty(Log::getConfig("LocalToolError{$this->connectorName}"))) {
|
|
Log::setConfig("LocalToolError{$this->connectorName}", [
|
|
'className' => FileLog::class,
|
|
'path' => LOGS,
|
|
'file' => "{$this->connectorName}-error",
|
|
'scopes' => [$this->connectorName],
|
|
'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
|
|
]);
|
|
}
|
|
}
|
|
|
|
protected function logDebug($message)
|
|
{
|
|
Log::debug($message, [$this->connectorName]);
|
|
}
|
|
|
|
protected function logError($message, $scope=[])
|
|
{
|
|
Log::error($message, [$this->connectorName]);
|
|
}
|
|
|
|
public function addExposedFunction(string $functionName): void
|
|
{
|
|
$this->exposedFunctions[] = $functionName;
|
|
}
|
|
|
|
public function getBatchActionFunctions(): array
|
|
{
|
|
return array_filter($this->exposedFunctions, function($function) {
|
|
return $function['type'] == 'batchAction';
|
|
});
|
|
}
|
|
|
|
public function runAction($action, $params) {
|
|
if (!in_array($action, $exposedFunctions)) {
|
|
throw new MethodNotAllowedException(__('Invalid connector function called.'));
|
|
}
|
|
return $this->{$action}($params);
|
|
}
|
|
|
|
public function health(Object $connection): array
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
public function captureOrganisation($input): bool
|
|
{
|
|
if (empty($input['uuid'])) {
|
|
return false;
|
|
}
|
|
$organisations = \Cake\ORM\TableRegistry::getTableLocator()->get('Organisations');
|
|
$organisations->captureOrg($input);
|
|
return true;
|
|
}
|
|
|
|
public function getOrganisation(string $uuid): ?array
|
|
{
|
|
$organisations = \Cake\ORM\TableRegistry::getTableLocator()->get('Organisations');
|
|
$org = $organisations->find()->where(['Organisations.uuid' => $uuid])->disableHydration()->first();
|
|
return $org;
|
|
}
|
|
|
|
public function getOrganisations(): array
|
|
{
|
|
$organisations = \Cake\ORM\TableRegistry::getTableLocator()->get('Organisations');
|
|
$orgs = $organisations->find()->disableHydration()->toArray();
|
|
return $orgs;
|
|
}
|
|
|
|
public function getSharingGroups(): array
|
|
{
|
|
$sgs = \Cake\ORM\TableRegistry::getTableLocator()->get('SharingGroups');
|
|
$sgs = $sgs->find()
|
|
->contain(['Organisations' => ['fields' => ['uuid']], 'SharingGroupOrgs' => ['fields' => ['uuid']]])
|
|
->disableHydration()
|
|
->toArray();
|
|
return $sgs;
|
|
}
|
|
|
|
public function getFilteredOrganisations($filters, $returnObjects = false): array
|
|
{
|
|
$organisations = \Cake\ORM\TableRegistry::getTableLocator()->get('Organisations');
|
|
$orgs = $organisations->find();
|
|
$filterFields = ['type', 'nationality', 'sector'];
|
|
foreach ($filterFields as $filterField) {
|
|
if (!empty($filters[$filterField]) && $filters[$filterField] !== 'ALL') {
|
|
$orgs = $orgs->where([$filterField => $filters[$filterField]]);
|
|
}
|
|
}
|
|
if (!empty($filters['local']) && $filters['local'] !== '0') {
|
|
$users = \Cake\ORM\TableRegistry::getTableLocator()->get('users');
|
|
$org_ids = array_values(array_unique($users->find('list', [
|
|
'valueField' => 'organisation_id'
|
|
])->toArray()));
|
|
$orgs = $orgs->where(['id IN' => $org_ids]);
|
|
}
|
|
if ($returnObjects) {
|
|
$orgs = $orgs->toArray();
|
|
} else {
|
|
$orgs = $orgs->disableHydration()->all();
|
|
}
|
|
return $orgs;
|
|
}
|
|
|
|
public function getFilteredSharingGroups($filters, $returnObjects = false): array
|
|
{
|
|
$SG = \Cake\ORM\TableRegistry::getTableLocator()->get('SharingGroups');
|
|
$sgs = $SG->find();
|
|
$filterFields = ['name', 'releasability'];
|
|
$sgs->contain(['SharingGroupOrgs', 'Organisations']);
|
|
foreach ($filterFields as $filterField) {
|
|
if (!empty($filters[$filterField]) && $filters[$filterField] !== 'ALL') {
|
|
if (is_string($filters[$filterField]) && strpos($filters[$filterField], '%') !== false) {
|
|
$sgs = $sgs->where(['SharingGroups.' . $filterField . ' LIKE' => $filters[$filterField]]);
|
|
} else {
|
|
|
|
$sgs = $sgs->where(['SharingGroups.' . $filterField => $filters[$filterField]]);
|
|
}
|
|
}
|
|
}
|
|
if ($returnObjects) {
|
|
$sgs = $sgs->toArray();
|
|
} else {
|
|
$sgs = $sgs->disableHydration()->all();
|
|
}
|
|
return $sgs;
|
|
}
|
|
|
|
public function getOrganisationSelectorValues(): array
|
|
{
|
|
$results = [];
|
|
$orgTable = \Cake\ORM\TableRegistry::getTableLocator()->get('Organisations');
|
|
$fields = [
|
|
'nationality' => 'nat',
|
|
'sector' => 'sect',
|
|
'type' => 'typ'
|
|
];
|
|
foreach ($fields as $field => $temp_field) {
|
|
$temp = Hash::extract(
|
|
$orgTable->find()
|
|
->select([$temp_field => 'DISTINCT (' . $field . ')'])
|
|
->order([$temp_field => 'DESC'])
|
|
->disableHydration()->toArray(),
|
|
'{n}.' . $temp_field
|
|
);
|
|
foreach ($temp as $k => $v) {
|
|
if (empty($v)) {
|
|
unset($temp[$k]);
|
|
}
|
|
}
|
|
asort($temp, SORT_FLAG_CASE | SORT_NATURAL);
|
|
$temp = array_merge(['ALL' => 'ALL'], $temp);
|
|
$results[$field] = array_combine($temp, $temp);
|
|
}
|
|
return $results;
|
|
}
|
|
|
|
public function captureSharingGroup($input, $user_id): bool
|
|
{
|
|
if (empty($input['uuid'])) {
|
|
return false;
|
|
}
|
|
$sharing_groups = \Cake\ORM\TableRegistry::getTableLocator()->get('SharingGroups');
|
|
$sharing_groups->captureSharingGroup($input, $user_id);
|
|
return true;
|
|
}
|
|
|
|
public function remoteToolConnectionStatus(array $params, string $status): void
|
|
{
|
|
$remoteToolConnections = \Cake\ORM\TableRegistry::getTableLocator()->get('RemoteToolConnections');
|
|
$remoteToolConnection = $remoteToolConnections->find()->where(
|
|
[
|
|
'local_tool_id' => $params['connection']['id'],
|
|
'remote_tool_id' => $params['remote_tool']['id'],
|
|
'brood_id' => $params['remote_cerebrate']['id']
|
|
]
|
|
)->first();
|
|
if (empty($remoteToolConnection)) {
|
|
$data = $remoteToolConnections->newEmptyEntity();
|
|
$entry = [
|
|
'local_tool_id' => $params['connection']['id'],
|
|
'remote_tool_id' => $params['remote_tool']['id'],
|
|
'remote_tool_name' => $params['remote_tool']['name'],
|
|
'brood_id' => $params['remote_cerebrate']['id'],
|
|
'name' => '',
|
|
'settings' => '',
|
|
'status' => $status,
|
|
'created' => time(),
|
|
'modified' => time()
|
|
];
|
|
$data = $remoteToolConnections->patchEntity($data, $entry);
|
|
$remoteToolConnections->save($data);
|
|
} else {
|
|
$data = $remoteToolConnections->patchEntity($remoteToolConnection, ['status' => $status, 'modified' => time()]);
|
|
$remoteToolConnections->save($data);
|
|
}
|
|
}
|
|
|
|
public function initiateConnectionWrapper(array $params): array
|
|
{
|
|
$result = $this->initiateConnection($params);
|
|
$this->remoteToolConnectionStatus($params, self::STATE_INITIAL);
|
|
return $result;
|
|
}
|
|
|
|
public function acceptConnectionWrapper(array $params): array
|
|
{
|
|
$result = $this->acceptConnection($params);
|
|
$this->remoteToolConnectionStatus($params, self::STATE_ACCEPT);
|
|
return $result;
|
|
}
|
|
|
|
public function finaliseConnectionWrapper(array $params): bool
|
|
{
|
|
$result = $this->finaliseConnection($params);
|
|
$this->remoteToolConnectionStatus($params, self::STATE_CONNECTED);
|
|
return false;
|
|
}
|
|
|
|
public function diagnostics(array $params): array
|
|
{
|
|
return [];
|
|
}
|
|
}
|
|
|
|
?>
|