chg: [requestProcessor] Improved integration with local tool connectors
parent
63e9dd1644
commit
1d293c350f
|
@ -60,7 +60,7 @@ class LocalToolRequestProcessor extends GenericRequestProcessor
|
||||||
try {
|
try {
|
||||||
$connectorClasses = $this->LocalTools->getConnectorByToolName($request->local_tool_name);
|
$connectorClasses = $this->LocalTools->getConnectorByToolName($request->local_tool_name);
|
||||||
if (!empty($connectorClasses)) {
|
if (!empty($connectorClasses)) {
|
||||||
$connector = $this->LocalTools->extractMeta($connectorClasses)[0];
|
$connector = array_values($connectorClasses)[0];
|
||||||
}
|
}
|
||||||
} catch (Cake\Http\Exception\NotFoundException $e) {
|
} catch (Cake\Http\Exception\NotFoundException $e) {
|
||||||
$connector = null;
|
$connector = null;
|
||||||
|
@ -68,12 +68,25 @@ class LocalToolRequestProcessor extends GenericRequestProcessor
|
||||||
return $connector;
|
return $connector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getConnectorMeta($request)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$connectorClasses = $this->LocalTools->getConnectorByToolName($request->local_tool_name);
|
||||||
|
if (!empty($connectorClasses)) {
|
||||||
|
$connectorMeta = $this->LocalTools->extractMeta($connectorClasses)[0];
|
||||||
|
}
|
||||||
|
} catch (Cake\Http\Exception\NotFoundException $e) {
|
||||||
|
$connectorMeta = null;
|
||||||
|
}
|
||||||
|
return !is_null($connectorMeta) ? $connectorMeta : [];
|
||||||
|
}
|
||||||
|
|
||||||
protected function addBaseValidatorRules($validator)
|
protected function addBaseValidatorRules($validator)
|
||||||
{
|
{
|
||||||
return $validator
|
return $validator
|
||||||
->requirePresence('toolName')
|
->requirePresence('toolName')
|
||||||
->notEmpty('toolName', 'A url must be provided')
|
->notEmpty('toolName', 'A url must be provided')
|
||||||
->requirePresence('url')
|
->requirePresence('url') // url -> cerebrate_url
|
||||||
->notEmpty('url', 'A url must be provided');
|
->notEmpty('url', 'A url must be provided');
|
||||||
// ->add('url', 'validFormat', [
|
// ->add('url', 'validFormat', [
|
||||||
// 'rule' => 'url',
|
// 'rule' => 'url',
|
||||||
|
@ -106,7 +119,7 @@ class IncomingConnectionRequestProcessor extends LocalToolRequestProcessor imple
|
||||||
public function getViewVariables($request)
|
public function getViewVariables($request)
|
||||||
{
|
{
|
||||||
$request->brood = $this->getIssuerBrood($request);
|
$request->brood = $this->getIssuerBrood($request);
|
||||||
$request->connector = $this->getConnector($request);
|
$request->connector = $this->getConnectorMeta($request);
|
||||||
return [
|
return [
|
||||||
'request' => $request,
|
'request' => $request,
|
||||||
'progressStep' => 0,
|
'progressStep' => 0,
|
||||||
|
@ -115,32 +128,76 @@ class IncomingConnectionRequestProcessor extends LocalToolRequestProcessor imple
|
||||||
|
|
||||||
public function process($id, $requestData, $inboxRequest)
|
public function process($id, $requestData, $inboxRequest)
|
||||||
{
|
{
|
||||||
$connectionSuccessfull = false;
|
/**
|
||||||
|
* /!\ Should how should sent message be? be fire and forget? Only for delined?
|
||||||
|
*/
|
||||||
$interConnectionResult = [];
|
$interConnectionResult = [];
|
||||||
|
$remoteCerebrate = $this->getIssuerBrood($inboxRequest);
|
||||||
$remoteCerebrate = $this->getIssuerBrood($request);
|
$connector = $this->getConnector($inboxRequest);
|
||||||
$connector = $this->getConnector($request);
|
if (!empty($requestData['is_discard'])) { // -> declined
|
||||||
$connectorResult = $connector->acceptConnection($requestData['data']);
|
$connectorResult = $this->declineConnection($connector, $remoteCerebrate, $inboxRequest['data']); // Fire-and-forget?
|
||||||
$connectorResult['toolName'] = $requestData->local_tool_name;
|
$connectionSuccessfull = true;
|
||||||
$urlPath = '/inbox/createInboxEntry/LocalTool/AcceptedRequest';
|
$resultTitle = __('Could not sent declined message to `{0}`\'s for {1}', $inboxRequest['origin'], $inboxRequest['local_tool_name']);
|
||||||
$response = $this->Inbox->sendRequest($remoteCerebrate, $urlPath, true, $connectorResult);
|
$errors = [];
|
||||||
|
if ($connectionSuccessfull) {
|
||||||
if ($connectionSuccessfull) {
|
$resultTitle = __('Declined message successfully sent to `{0}`\'s for {1}', $inboxRequest['origin'], $inboxRequest['local_tool_name']);
|
||||||
$this->discard($id, $requestData);
|
$this->discard($id, $inboxRequest);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$connectorResult = $this->acceptConnection($connector, $remoteCerebrate, $inboxRequest['data']);
|
||||||
|
$connectionSuccessfull = false;
|
||||||
|
$connectionData = [];
|
||||||
|
$resultTitle = __('Could not inter-connect `{0}`\'s {1}', $inboxRequest['origin'], $inboxRequest['local_tool_name']);
|
||||||
|
$errors = [];
|
||||||
|
if ($connectionSuccessfull) {
|
||||||
|
$resultTitle = __('Interconnection for `{0}`\'s {1} created', $inboxRequest['origin'], $inboxRequest['local_tool_name']);
|
||||||
|
$this->discard($id, $inboxRequest);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return $this->genActionResult(
|
return $this->genActionResult(
|
||||||
$interConnectionResult,
|
$connectionData,
|
||||||
$connectionSuccessfull,
|
$connectionSuccessfull,
|
||||||
$connectionSuccessfull ? __('Interconnection for `{0}`\'s {1} created',$requestData['origin'], $requestData['local_tool_name']) : __('Could not inter-connect `{0}`\'s {1}', $requestData['origin'], $requestData['local_tool_name']),
|
$resultTitle,
|
||||||
[]
|
$errors
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function discard($id, $requestData)
|
public function discard($id, $requestData)
|
||||||
{
|
{
|
||||||
// /!\ TODO: send decline message to remote cerebrate
|
|
||||||
return parent::discard($id, $requestData);
|
return parent::discard($id, $requestData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function acceptConnection($connector, $remoteCerebrate, $requestData)
|
||||||
|
{
|
||||||
|
$connectorResult = $connector->acceptConnection($requestData['data']);
|
||||||
|
$connectorResult['toolName'] = $requestData->local_tool_name;
|
||||||
|
$response = $this->sendAcceptedRequestToRemote($remoteCerebrate, $connectorResult);
|
||||||
|
// change state if sending fails
|
||||||
|
// add the entry to the outbox if sending fails.
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function declineConnection($connector, $remoteCerebrate, $requestData)
|
||||||
|
{
|
||||||
|
$connectorResult = $connector->declineConnection($requestData['data']);
|
||||||
|
$connectorResult['toolName'] = $requestData->local_tool_name;
|
||||||
|
$response = $this->sendDeclinedRequestToRemote($remoteCerebrate, $connectorResult);
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function sendAcceptedRequestToRemote($remoteCerebrate, $connectorResult)
|
||||||
|
{
|
||||||
|
$urlPath = '/inbox/createInboxEntry/LocalTool/AcceptedRequest';
|
||||||
|
$response = $this->Inbox->sendRequest($remoteCerebrate, $urlPath, true, $connectorResult);
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function sendDeclinedRequestToRemote($remoteCerebrate, $connectorResult)
|
||||||
|
{
|
||||||
|
$urlPath = '/inbox/createInboxEntry/LocalTool/DeclinedRequest';
|
||||||
|
$response = $this->Inbox->sendRequest($remoteCerebrate, $urlPath, true, $connectorResult);
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class AcceptedRequestProcessor extends LocalToolRequestProcessor implements GenericProcessorActionI {
|
class AcceptedRequestProcessor extends LocalToolRequestProcessor implements GenericProcessorActionI {
|
||||||
|
@ -168,7 +225,7 @@ class AcceptedRequestProcessor extends LocalToolRequestProcessor implements Gene
|
||||||
public function getViewVariables($request)
|
public function getViewVariables($request)
|
||||||
{
|
{
|
||||||
$request->brood = $this->getIssuerBrood($request);
|
$request->brood = $this->getIssuerBrood($request);
|
||||||
$request->connector = $this->getConnector($request);
|
$request->connector = $this->getConnectorMeta($request);
|
||||||
return [
|
return [
|
||||||
'request' => $request,
|
'request' => $request,
|
||||||
'progressStep' => 1,
|
'progressStep' => 1,
|
||||||
|
@ -177,16 +234,22 @@ class AcceptedRequestProcessor extends LocalToolRequestProcessor implements Gene
|
||||||
|
|
||||||
public function process($id, $requestData, $inboxRequest)
|
public function process($id, $requestData, $inboxRequest)
|
||||||
{
|
{
|
||||||
|
$connector = $this->getConnector($request);
|
||||||
|
$remoteCerebrate = $this->getIssuerBrood($request);
|
||||||
|
$connectorResult = $this->finalizeConnection($connector, $remoteCerebrate, $requestData['data']);
|
||||||
$connectionSuccessfull = false;
|
$connectionSuccessfull = false;
|
||||||
$interConnectionResult = [];
|
$connectionData = [];
|
||||||
|
$resultTitle = __('Could not finalize inter-connection for `{0}`\'s {1}', $requestData['origin'], $requestData['local_tool_name']);
|
||||||
|
$errors = [];
|
||||||
if ($connectionSuccessfull) {
|
if ($connectionSuccessfull) {
|
||||||
|
$resultTitle = __('Interconnection for `{0}`\'s {1} finalized', $requestData['origin'], $requestData['local_tool_name']);
|
||||||
$this->discard($id, $requestData);
|
$this->discard($id, $requestData);
|
||||||
}
|
}
|
||||||
return $this->genActionResult(
|
return $this->genActionResult(
|
||||||
$interConnectionResult,
|
$connectionData,
|
||||||
$connectionSuccessfull,
|
$connectionSuccessfull,
|
||||||
$connectionSuccessfull ? __('Interconnection for `{0}`\'s {1} finalized', $requestData['origin'], $requestData['local_tool_name']) : __('Could not inter-connect `{0}`\'s {1}', $requestData['origin'], $requestData['local_tool_name']),
|
$resultTitle,
|
||||||
[]
|
$errors
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,6 +257,12 @@ class AcceptedRequestProcessor extends LocalToolRequestProcessor implements Gene
|
||||||
{
|
{
|
||||||
return parent::discard($id, $requestData);
|
return parent::discard($id, $requestData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function finalizeConnection($connector, $remoteCerebrate, $requestData)
|
||||||
|
{
|
||||||
|
$connectorResult = $connector->finaliseConnection($requestData['data']);
|
||||||
|
return $connectorResult;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class DeclinedRequestProcessor extends LocalToolRequestProcessor implements GenericProcessorActionI {
|
class DeclinedRequestProcessor extends LocalToolRequestProcessor implements GenericProcessorActionI {
|
||||||
|
@ -220,7 +289,7 @@ class DeclinedRequestProcessor extends LocalToolRequestProcessor implements Gene
|
||||||
public function getViewVariables($request)
|
public function getViewVariables($request)
|
||||||
{
|
{
|
||||||
$request->brood = $this->getIssuerBrood($request);
|
$request->brood = $this->getIssuerBrood($request);
|
||||||
$request->connector = $this->getConnector($request);
|
$request->connector = $this->getConnectorMeta($request);
|
||||||
return [
|
return [
|
||||||
'request' => $request,
|
'request' => $request,
|
||||||
'progressStep' => 1,
|
'progressStep' => 1,
|
||||||
|
|
|
@ -4,7 +4,8 @@ $defaultSteps = [
|
||||||
'text' => __('Request Sent'),
|
'text' => __('Request Sent'),
|
||||||
'icon' => 'paper-plane',
|
'icon' => 'paper-plane',
|
||||||
'title' => __(''),
|
'title' => __(''),
|
||||||
'confirmButton' => __('Accept Request')
|
'confirmButton' => __('Accept Request'),
|
||||||
|
'canDiscard' => true,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'text' => __('Request Accepted'),
|
'text' => __('Request Accepted'),
|
||||||
|
@ -19,6 +20,8 @@ $defaultSteps = [
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
$footerButtons = [];
|
||||||
|
|
||||||
$progressVariant = !empty($progressVariant) ? $progressVariant : 'info';
|
$progressVariant = !empty($progressVariant) ? $progressVariant : 'info';
|
||||||
$finalSteps = array_replace($defaultSteps, $steps ?? []);
|
$finalSteps = array_replace($defaultSteps, $steps ?? []);
|
||||||
$currentStep = $finalSteps[$progressStep];
|
$currentStep = $finalSteps[$progressStep];
|
||||||
|
@ -28,6 +31,23 @@ $progress = $this->Bootstrap->progressTimeline([
|
||||||
'steps' => $finalSteps,
|
'steps' => $finalSteps,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$footerButtons[] = [
|
||||||
|
'clickFunction' => 'cancel',
|
||||||
|
'variant' => 'secondary',
|
||||||
|
'text' => __('Cancel'),
|
||||||
|
];
|
||||||
|
if (!empty($currentStep['canDiscard'])) {
|
||||||
|
$footerButtons[] = [
|
||||||
|
'clickFunction' => 'discard',
|
||||||
|
'variant' => 'danger',
|
||||||
|
'text' => __('Decline Request'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
$footerButtons[] = [
|
||||||
|
'clickFunction' => 'accept',
|
||||||
|
'text' => $currentStep['confirmButton'] ?? __('Submit'),
|
||||||
|
];
|
||||||
|
|
||||||
$table = $this->Bootstrap->table(['small' => true, 'bordered' => false, 'striped' => false, 'hover' => false], [
|
$table = $this->Bootstrap->table(['small' => true, 'bordered' => false, 'striped' => false, 'hover' => false], [
|
||||||
'fields' => [
|
'fields' => [
|
||||||
['key' => 'connector', 'label' => __('Tool Name'), 'formatter' => function($connector, $row) {
|
['key' => 'connector', 'label' => __('Tool Name'), 'formatter' => function($connector, $row) {
|
||||||
|
@ -55,7 +75,13 @@ $form = $this->element('genericElements/Form/genericForm', [
|
||||||
'raw' => true,
|
'raw' => true,
|
||||||
'data' => [
|
'data' => [
|
||||||
'model' => 'Inbox',
|
'model' => 'Inbox',
|
||||||
'fields' => [],
|
'fields' => [
|
||||||
|
[
|
||||||
|
'field' => 'is_discard',
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'default' => false
|
||||||
|
]
|
||||||
|
],
|
||||||
'submit' => [
|
'submit' => [
|
||||||
'action' => $this->request->getParam('action')
|
'action' => $this->request->getParam('action')
|
||||||
]
|
]
|
||||||
|
@ -70,7 +96,7 @@ $requestData = $this->Bootstrap->collapse(
|
||||||
sprintf('<pre class="p-2 rounded mb-0" style="background: #eee;"><code>%s</code></pre>', json_encode($request['data'], JSON_PRETTY_PRINT))
|
sprintf('<pre class="p-2 rounded mb-0" style="background: #eee;"><code>%s</code></pre>', json_encode($request['data'], JSON_PRETTY_PRINT))
|
||||||
);
|
);
|
||||||
|
|
||||||
$bodyHtml = sprintf('<div class="py-2"><div>%s</div>%s</div>%s',
|
$bodyHtml = sprintf('<div class="py-2"><div>%s</div>%s</div><div class="d-none">%s</div>',
|
||||||
$table,
|
$table,
|
||||||
$requestData,
|
$requestData,
|
||||||
$form
|
$form
|
||||||
|
@ -79,10 +105,27 @@ $bodyHtml = sprintf('<div class="py-2"><div>%s</div>%s</div>%s',
|
||||||
echo $this->Bootstrap->modal([
|
echo $this->Bootstrap->modal([
|
||||||
'title' => __('Interconnection Request for {0}', h($request->data['toolName'])),
|
'title' => __('Interconnection Request for {0}', h($request->data['toolName'])),
|
||||||
'size' => 'lg',
|
'size' => 'lg',
|
||||||
'type' => 'confirm',
|
'type' => 'custom',
|
||||||
'bodyHtml' => sprintf('<div class="p-3">%s</div><div class="description-container">%s</div>',
|
'bodyHtml' => sprintf('<div class="p-3">%s</div><div class="description-container">%s</div>',
|
||||||
$progress,
|
$progress,
|
||||||
$bodyHtml
|
$bodyHtml
|
||||||
),
|
),
|
||||||
'confirmText' => $currentStep['confirmButton'] ?? __('Submit'),
|
'footerButtons' => $footerButtons
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function accept(modalObject, tmpApi) {
|
||||||
|
const $form = modalObject.$modal.find('form')
|
||||||
|
return tmpApi.postForm($form[0])
|
||||||
|
}
|
||||||
|
function discard(modalObject, tmpApi) {
|
||||||
|
const $form = modalObject.$modal.find('form')
|
||||||
|
const $discardField = $form.find('input#is_discard-field')
|
||||||
|
$discardField.prop('checked', true)
|
||||||
|
return tmpApi.postForm($form[0])
|
||||||
|
}
|
||||||
|
function cancel(modalObject, tmpApi) {
|
||||||
|
}
|
||||||
|
</script>
|
Loading…
Reference in New Issue