2021-04-30 23:59:53 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Controller;
|
|
|
|
|
|
|
|
use App\Controller\AppController;
|
|
|
|
use Cake\Utility\Hash;
|
|
|
|
use Cake\Utility\Text;
|
|
|
|
use \Cake\Database\Expression\QueryExpression;
|
2022-06-08 11:51:52 +02:00
|
|
|
use Cake\Http\Exception\NotFoundException;
|
|
|
|
use Cake\Http\Exception\MethodNotAllowedException;
|
2021-04-30 23:59:53 +02:00
|
|
|
|
|
|
|
class LocalToolsController extends AppController
|
|
|
|
{
|
|
|
|
public function index()
|
|
|
|
{
|
|
|
|
$data = $this->LocalTools->extractMeta($this->LocalTools->getConnectors(), true);
|
|
|
|
if ($this->ParamHandler->isRest()) {
|
|
|
|
return $this->RestResponse->viewData($data, 'json');
|
|
|
|
}
|
|
|
|
$data = $this->CustomPagination->paginate($data);
|
|
|
|
$this->set('data', $data);
|
|
|
|
if ($this->request->is('ajax')) {
|
|
|
|
$this->viewBuilder()->disableAutoLayout();
|
|
|
|
}
|
2021-06-01 07:45:01 +02:00
|
|
|
$this->set('metaGroup', 'Administration');
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
|
|
|
|
2021-07-05 14:14:17 +02:00
|
|
|
public function connectorIndex($connectorName)
|
2021-04-30 23:59:53 +02:00
|
|
|
{
|
2021-06-01 07:45:01 +02:00
|
|
|
$this->set('metaGroup', 'Admin');
|
2021-04-30 23:59:53 +02:00
|
|
|
$this->CRUD->index([
|
|
|
|
'filters' => ['name', 'connector'],
|
|
|
|
'quickFilters' => ['name', 'connector'],
|
2021-07-05 14:14:17 +02:00
|
|
|
'filterFunction' => function($query) use ($connectorName) {
|
|
|
|
$query->where(['connector' => $connectorName]);
|
|
|
|
return $query;
|
|
|
|
},
|
2021-04-30 23:59:53 +02:00
|
|
|
'afterFind' => function($data) {
|
|
|
|
foreach ($data as $connector) {
|
|
|
|
$connector['health'] = [$this->LocalTools->healthCheckIndividual($connector)];
|
|
|
|
}
|
|
|
|
return $data;
|
|
|
|
}
|
|
|
|
]);
|
2021-06-29 16:15:05 +02:00
|
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
|
|
if (!empty($responsePayload)) {
|
|
|
|
return $responsePayload;
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
2021-07-07 15:05:32 +02:00
|
|
|
$connector = $this->LocalTools->getConnectors($connectorName)[$connectorName];
|
2021-06-01 07:45:01 +02:00
|
|
|
$this->set('metaGroup', 'Administration');
|
2021-07-07 15:05:32 +02:00
|
|
|
$this->set('connectorName', $connectorName);
|
|
|
|
$this->set('connector', $connector);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function batchAction($actionName)
|
|
|
|
{
|
|
|
|
$params = $this->ParamHandler->harvestParams(['connection_ids']);
|
|
|
|
$params['connection_ids'] = explode(',', $params['connection_ids']);
|
|
|
|
$connections = $this->LocalTools->query()->where(['id IN' => $params['connection_ids']])->all();
|
|
|
|
if (empty($connections)) {
|
|
|
|
throw new NotFoundException(__('Invalid connector.'));
|
|
|
|
}
|
|
|
|
$connection = $connections->first();
|
|
|
|
if ($this->request->is(['post', 'put'])) {
|
|
|
|
$actionParams = $this->LocalTools->getActionFilterOptions($connection->connector, $actionName);
|
|
|
|
$params = array_merge($params, $this->ParamHandler->harvestParams($actionParams));
|
|
|
|
$results = [];
|
|
|
|
$successes = 0;
|
|
|
|
$this->LocalTools->loadConnector($connection->connector);
|
|
|
|
foreach ($connections as $connection) {
|
|
|
|
$actionDetails = $this->LocalTools->getActionDetails($actionName);
|
|
|
|
$params['connection'] = $connection;
|
2021-12-21 12:34:37 +01:00
|
|
|
try {
|
|
|
|
$tmpResult = $this->LocalTools->action($this->ACL->getUser()['id'], $connection->connector, $actionName, $params, $this->request);
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
$tmpResult = ['success' => false, 'message' => $e->getMessage(), 'data' => []];
|
|
|
|
}
|
2021-07-07 15:05:32 +02:00
|
|
|
$tmpResult['connection'] = $connection;
|
|
|
|
$results[$connection->id] = $tmpResult;
|
|
|
|
$successes += $tmpResult['success'] ? 1 : 0;
|
|
|
|
}
|
|
|
|
$success = $successes > 0;
|
|
|
|
$message = __('{0} / {1} operations were successful', $successes, count($results));
|
|
|
|
$this->CRUD->setResponseForController('batchAction', $success, $message, $results, $results);
|
|
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
|
|
if (!empty($responsePayload)) {
|
|
|
|
return $responsePayload;
|
|
|
|
}
|
|
|
|
if (!empty($success)) {
|
|
|
|
$this->Flash->success($message);
|
|
|
|
$this->redirect(['controller' => 'localTools', 'action' => 'connectorIndex', $actionName]);
|
|
|
|
} else {
|
|
|
|
$this->Flash->error($message);
|
|
|
|
$this->redirect(['controller' => 'localTools', 'action' => 'connectorIndex', $actionName]);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$params['connection'] = $connection;
|
|
|
|
$results = $this->LocalTools->action($this->ACL->getUser()['id'], $connection->connector, $actionName, $params, $this->request);
|
|
|
|
$this->set('data', $results);
|
|
|
|
$this->set('metaGroup', 'Administration');
|
|
|
|
$this->render('/Common/getForm');
|
|
|
|
}
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
|
|
|
|
2021-06-01 07:45:01 +02:00
|
|
|
public function action($connectionId, $actionName)
|
2021-04-30 23:59:53 +02:00
|
|
|
{
|
2021-06-01 07:45:01 +02:00
|
|
|
$connection = $this->LocalTools->query()->where(['id' => $connectionId])->first();
|
|
|
|
if (empty($connection)) {
|
|
|
|
throw new NotFoundException(__('Invalid connector.'));
|
|
|
|
}
|
|
|
|
$params = $this->ParamHandler->harvestParams($this->LocalTools->getActionFilterOptions($connection->connector, $actionName));
|
|
|
|
$actionDetails = $this->LocalTools->getActionDetails($actionName);
|
|
|
|
$params['connection'] = $connection;
|
|
|
|
$results = $this->LocalTools->action($this->ACL->getUser()['id'], $connection->connector, $actionName, $params, $this->request);
|
2022-06-08 11:51:52 +02:00
|
|
|
if (empty($results)) {
|
|
|
|
throw new MethodNotAllowedException(__('Could not execute the requested action.'));
|
|
|
|
}
|
2021-06-01 07:45:01 +02:00
|
|
|
if (!empty($results['redirect'])) {
|
|
|
|
$this->redirect($results['redirect']);
|
|
|
|
}
|
|
|
|
if (!empty($results['restResponse'])) {
|
|
|
|
return $results['restResponse'];
|
|
|
|
}
|
|
|
|
if ($this->ParamHandler->isRest()) {
|
|
|
|
return $results['data']['data'];
|
|
|
|
}
|
|
|
|
$this->set('data', $results);
|
|
|
|
$this->set('metaGroup', 'Administration');
|
|
|
|
if ($actionDetails['type'] === 'formAction') {
|
|
|
|
if ($this->request->is(['post', 'put'])) {
|
|
|
|
if ($this->ParamHandler->isAjax()) {
|
|
|
|
if (!empty($results['success'])) {
|
|
|
|
return $this->RestResponse->ajaxSuccessResponse(
|
|
|
|
'LocalTools',
|
|
|
|
'action',
|
|
|
|
$connection,
|
|
|
|
empty($results['message']) ? __('Success.') : $results['message']
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
return $this->RestResponse->ajaxSuccessResponse(
|
|
|
|
'LocalTools',
|
|
|
|
'action',
|
|
|
|
false,
|
|
|
|
empty($results['message']) ? __('Success.') : $results['message']
|
|
|
|
//['displayOnSuccess' => $displayOnSuccess]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (!empty($results['success'])) {
|
|
|
|
$this->Flash->success(empty($results['message']) ? __('Success.') : $results['message']);
|
|
|
|
$this->redirect(['controller' => 'localTools', 'action' => 'action', $connectionId, $actionDetails['redirect']]);
|
|
|
|
} else {
|
|
|
|
$this->Flash->error(empty($results['message']) ? __('Could not execute the requested action.') : $results['message']);
|
|
|
|
$this->redirect(['controller' => 'localTools', 'action' => 'action', $connectionId, $actionDetails['redirect']]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$this->render('/Common/getForm');
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$this->render('/Common/' . $actionDetails['type']);
|
|
|
|
}
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
|
|
|
|
2021-07-05 14:14:17 +02:00
|
|
|
public function add($connectorName = false)
|
2021-04-30 23:59:53 +02:00
|
|
|
{
|
|
|
|
$this->CRUD->add();
|
2021-06-29 16:15:05 +02:00
|
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
|
|
if (!empty($responsePayload)) {
|
|
|
|
return $responsePayload;
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
2021-07-05 14:14:17 +02:00
|
|
|
$localConnectors = $this->LocalTools->extractMeta($this->LocalTools->getConnectors());
|
2021-04-30 23:59:53 +02:00
|
|
|
$dropdownData = ['connectors' => []];
|
2021-07-05 14:14:17 +02:00
|
|
|
$connector = false;
|
|
|
|
$connectors = [];
|
|
|
|
foreach ($localConnectors as $c) {
|
|
|
|
if (empty($connectorName) || $c['connector'] == $connectorName) {
|
|
|
|
$dropdownData['connectors'][$c['connector']] = $c['name'];
|
|
|
|
$connectors[] = $c;
|
|
|
|
}
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
2021-07-05 14:14:17 +02:00
|
|
|
$this->set('connectorName', $connectorName);
|
|
|
|
$this->set('connectors', $connectors);
|
2021-04-30 23:59:53 +02:00
|
|
|
$this->set(compact('dropdownData'));
|
2021-06-01 07:45:01 +02:00
|
|
|
$this->set('metaGroup', 'Administration');
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public function viewConnector($connector_name)
|
|
|
|
{
|
|
|
|
$connectors = $this->LocalTools->extractMeta($this->LocalTools->getConnectors());
|
|
|
|
$connector = false;
|
|
|
|
foreach ($connectors as $c) {
|
2021-07-05 14:14:17 +02:00
|
|
|
if ($connector_name == $c['connector'] && ($connector === false || version_compare($c['version'], $connectors['version']) > 0)) {
|
2021-04-30 23:59:53 +02:00
|
|
|
$connector = $c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($this->ParamHandler->isRest()) {
|
2021-06-01 07:45:01 +02:00
|
|
|
return $this->RestResponse->viewData($connector, 'json');
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
|
|
|
$this->set('entity', $connector);
|
2021-06-01 07:45:01 +02:00
|
|
|
$this->set('metaGroup', 'Administration');
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public function edit($id)
|
|
|
|
{
|
2021-07-05 14:14:17 +02:00
|
|
|
$localTool = $this->LocalTools->get($id);
|
2021-04-30 23:59:53 +02:00
|
|
|
$this->CRUD->edit($id);
|
2021-06-29 16:15:05 +02:00
|
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
|
|
if (!empty($responsePayload)) {
|
|
|
|
return $responsePayload;
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
2021-07-05 14:14:17 +02:00
|
|
|
$localConnectors = $this->LocalTools->extractMeta($this->LocalTools->getConnectors());
|
2021-04-30 23:59:53 +02:00
|
|
|
$dropdownData = ['connectors' => []];
|
2021-07-05 14:14:17 +02:00
|
|
|
$connector = false;
|
|
|
|
$connectors = [];
|
|
|
|
foreach ($localConnectors as $c) {
|
|
|
|
if (empty($localTool->connector) || $c['connector'] == $localTool->connector) {
|
|
|
|
$dropdownData['connectors'][$c['connector']] = $c['name'];
|
|
|
|
$connectors[] = $c;
|
|
|
|
}
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
|
|
|
$this->set(compact('dropdownData'));
|
2021-07-05 14:14:17 +02:00
|
|
|
$this->set('connectorName', $localTool->connector);
|
|
|
|
$this->set('connectors', $connectors);
|
2021-06-01 07:45:01 +02:00
|
|
|
$this->set('metaGroup', 'Administration');
|
2021-04-30 23:59:53 +02:00
|
|
|
$this->render('add');
|
|
|
|
}
|
|
|
|
|
|
|
|
public function delete($id)
|
|
|
|
{
|
|
|
|
$this->CRUD->delete($id);
|
2021-06-29 16:15:05 +02:00
|
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
|
|
if (!empty($responsePayload)) {
|
|
|
|
return $responsePayload;
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
2021-06-01 07:45:01 +02:00
|
|
|
$this->set('metaGroup', 'Administration');
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public function view($id)
|
|
|
|
{
|
2021-06-01 07:45:01 +02:00
|
|
|
$localTools = $this->LocalTools;
|
|
|
|
$this->CRUD->view($id, [
|
|
|
|
'afterFind' => function ($data) use($id, $localTools) {
|
|
|
|
$data['children'] = $localTools->getChildParameters($id);
|
|
|
|
return $data;
|
|
|
|
}
|
|
|
|
]);
|
2021-04-30 23:59:53 +02:00
|
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
|
|
if (!empty($responsePayload)) {
|
|
|
|
return $responsePayload;
|
|
|
|
}
|
2021-06-01 07:45:01 +02:00
|
|
|
$this->set('metaGroup', 'Administration');
|
|
|
|
}
|
|
|
|
|
|
|
|
public function exposedTools()
|
|
|
|
{
|
|
|
|
$this->CRUD->index([
|
|
|
|
'filters' => ['name', 'connector'],
|
|
|
|
'quickFilters' => ['name', 'connector'],
|
|
|
|
'fields' => ['id', 'name', 'connector', 'description'],
|
|
|
|
'filterFunction' => function($query) {
|
|
|
|
$query->where(['exposed' => 1]);
|
|
|
|
return $query;
|
|
|
|
},
|
|
|
|
'afterFind' => function($data) {
|
|
|
|
foreach ($data as $connector) {
|
2021-06-16 09:47:26 +02:00
|
|
|
$connectorById = $this->LocalTools->getConnectorByConnectionId($connector['id']);
|
2021-06-14 16:46:53 +02:00
|
|
|
$className = array_keys($connectorById)[0];
|
|
|
|
$connector['connectorName'] = $className;
|
2021-06-01 07:45:01 +02:00
|
|
|
}
|
|
|
|
return $data;
|
|
|
|
}
|
|
|
|
]);
|
2021-06-29 16:15:05 +02:00
|
|
|
$responsePayload = $this->CRUD->getResponsePayload();
|
|
|
|
if (!empty($responsePayload)) {
|
|
|
|
return $responsePayload;
|
2021-06-01 07:45:01 +02:00
|
|
|
}
|
|
|
|
$this->set('metaGroup', 'Administration');
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
|
|
|
|
2021-06-01 07:45:01 +02:00
|
|
|
public function broodTools($id)
|
2021-04-30 23:59:53 +02:00
|
|
|
{
|
2021-06-01 07:45:01 +02:00
|
|
|
$this->loadModel('Broods');
|
|
|
|
$tools = $this->Broods->queryLocalTools($id);
|
2021-06-11 14:27:22 +02:00
|
|
|
foreach ($tools as $k => $tool) {
|
|
|
|
$tools[$k]['local_tools'] = $this->LocalTools->appendLocalToolConnections($id, $tool);
|
|
|
|
}
|
2021-06-01 07:45:01 +02:00
|
|
|
if ($this->ParamHandler->isRest()) {
|
|
|
|
return $this->RestResponse->viewData($tools, 'json');
|
|
|
|
}
|
2021-06-10 13:45:46 +02:00
|
|
|
$this->set('id', $id);
|
2021-10-08 10:08:02 +02:00
|
|
|
$brood = $this->Broods->get($id);
|
|
|
|
$this->set('broodEntity', $brood);
|
2021-06-01 07:45:01 +02:00
|
|
|
$this->set('data', $tools);
|
|
|
|
$this->set('metaGroup', 'Administration');
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|
2021-06-10 13:45:46 +02:00
|
|
|
|
|
|
|
public function connectionRequest($cerebrate_id, $remote_tool_id)
|
|
|
|
{
|
|
|
|
$params = [
|
|
|
|
'cerebrate_id' => $cerebrate_id,
|
|
|
|
'remote_tool_id' => $remote_tool_id
|
|
|
|
];
|
2021-06-12 15:29:16 +02:00
|
|
|
$this->loadModel('Broods');
|
|
|
|
$remoteCerebrate = $this->Broods->find()->where(['id' => $params['cerebrate_id']])->first();
|
2021-06-10 13:45:46 +02:00
|
|
|
if ($this->request->is(['post', 'put'])) {
|
2021-06-14 16:46:53 +02:00
|
|
|
$postParams = $this->ParamHandler->harvestParams(['local_tool_id']);
|
2021-06-10 13:45:46 +02:00
|
|
|
if (empty($postParams['local_tool_id'])) {
|
|
|
|
throw new MethodNotAllowedException(__('No local tool ID supplied.'));
|
|
|
|
}
|
|
|
|
$params['local_tool_id'] = $postParams['local_tool_id'];
|
2022-01-24 16:12:46 +01:00
|
|
|
try {
|
|
|
|
$encodingResult = $this->LocalTools->encodeConnection($params);
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
$encodingResult = [
|
|
|
|
'inboxResult' => [
|
|
|
|
'success' => false,
|
|
|
|
'message' => __('Error while trying to encode connection'),
|
|
|
|
'errors' => [$e->getMessage()],
|
|
|
|
],
|
|
|
|
];
|
|
|
|
}
|
2021-06-17 14:13:10 +02:00
|
|
|
$inboxResult = $encodingResult['inboxResult'];
|
|
|
|
if ($inboxResult['success']) {
|
|
|
|
if ($this->ParamHandler->isRest()) {
|
|
|
|
$response = $this->RestResponse->viewData($inboxResult, 'json');
|
|
|
|
} else if ($this->ParamHandler->isAjax()) {
|
|
|
|
$response = $this->RestResponse->ajaxSuccessResponse('LocalTool', 'connectionRequest', [], $inboxResult['message']);
|
|
|
|
} else {
|
|
|
|
$this->Flash->success($inboxResult['message']);
|
2021-06-19 13:16:25 +02:00
|
|
|
$response = $this->redirect(['action' => 'broodTools', $cerebrate_id]);
|
2021-06-17 14:13:10 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ($this->ParamHandler->isRest()) {
|
|
|
|
$response = $this->RestResponse->viewData($inboxResult, 'json');
|
|
|
|
} else if ($this->ParamHandler->isAjax()) {
|
|
|
|
$response = $this->RestResponse->ajaxFailResponse('LocalTool', 'connectionRequest', [], $inboxResult['message'], $inboxResult['errors']);
|
|
|
|
} else {
|
|
|
|
$this->Flash->error($inboxResult['message']);
|
2021-06-19 13:16:25 +02:00
|
|
|
$response = $this->redirect($this->referer());
|
2021-06-17 14:13:10 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return $response;
|
2021-06-10 13:45:46 +02:00
|
|
|
} else {
|
|
|
|
$remoteTool = $this->LocalTools->getRemoteToolById($params);
|
|
|
|
$local_tools = $this->LocalTools->encodeConnectionChoice($params);
|
|
|
|
if (empty($local_tools)) {
|
|
|
|
throw new NotFoundException(__('No local equivalent tool found.'));
|
|
|
|
}
|
|
|
|
$this->set('data', [
|
|
|
|
'remoteCerebrate' => $remoteCerebrate,
|
|
|
|
'remoteTool' => $remoteTool,
|
|
|
|
'local_tools' => $local_tools
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|
2021-06-28 10:45:23 +02:00
|
|
|
|
2022-01-17 13:15:26 +01:00
|
|
|
/*
|
2021-06-28 10:45:23 +02:00
|
|
|
public function connectLocal($local_tool_id)
|
|
|
|
{
|
|
|
|
$params = [
|
|
|
|
'local_tool_id' => $local_tool_id
|
|
|
|
];
|
|
|
|
$local_tool = $this->LocalTools->fetchConnection($local_tool_id);
|
|
|
|
if ($this->request->is(['post', 'put'])) {
|
|
|
|
$postParams = $this->ParamHandler->harvestParams(['target_tool_id']);
|
|
|
|
if (empty($postParams['target_tool_id'])) {
|
|
|
|
throw new MethodNotAllowedException(__('No target tool ID supplied.'));
|
|
|
|
}
|
|
|
|
|
|
|
|
$params['target_tool_id'] = $postParams['target_tool_id'];
|
|
|
|
$result = $this->LocalTools->encodeLocalConnection($params);
|
|
|
|
// Send message to remote inbox
|
|
|
|
} else {
|
|
|
|
$target_tools = $this->LocalTools->findConnectable($local_tool);
|
|
|
|
if (empty($target_tools)) {
|
|
|
|
throw new NotFoundException(__('No tools found to connect.'));
|
|
|
|
}
|
|
|
|
$this->set('data', [
|
|
|
|
'remoteCerebrate' => $remoteCerebrate,
|
|
|
|
'remoteTool' => $remoteTool,
|
|
|
|
'local_tools' => $local_tools
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|
2022-01-17 13:15:26 +01:00
|
|
|
*/
|
2021-04-30 23:59:53 +02:00
|
|
|
}
|