diff --git a/application/Espo/Controllers/Action.php b/application/Espo/Core/Action/Api/PostProcess.php similarity index 79% rename from application/Espo/Controllers/Action.php rename to application/Espo/Core/Action/Api/PostProcess.php index e34a17a19d..7df97c4b0c 100644 --- a/application/Espo/Controllers/Action.php +++ b/application/Espo/Core/Action/Api/PostProcess.php @@ -27,29 +27,24 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\Controllers; +namespace Espo\Core\Action\Api; -use Espo\Core\{ - Exceptions\BadRequest, - Action\Service, - Api\Request, -}; - -use stdClass; +use Espo\Core\Api\Action; +use Espo\Core\Api\Request; +use Espo\Core\Api\Response; +use Espo\Core\Action\Service; +use Espo\Core\Api\ResponseComposer; +use Espo\Core\Exceptions\BadRequest; /** - * Action framework. + * Processes actions. */ -class Action +class PostProcess implements Action { - private $service; + public function __construct(private Service $service) + {} - public function __construct(Service $service) - { - $this->service = $service; - } - - public function postActionProcess(Request $request): stdClass + public function process(Request $request): Response { $body = $request->getParsedBody(); @@ -64,6 +59,6 @@ class Action $entity = $this->service->process($entityType, $action, $id, $data); - return $entity->getValueMap(); + return ResponseComposer::json($entity->getValueMap()); } } diff --git a/application/Espo/Core/MassAction/Api/GetStatus.php b/application/Espo/Core/MassAction/Api/GetStatus.php new file mode 100644 index 0000000000..160fcbadb4 --- /dev/null +++ b/application/Espo/Core/MassAction/Api/GetStatus.php @@ -0,0 +1,56 @@ +getRouteParam('id'); + + if (!$id) { + throw new BadRequest(); + } + + $result = $this->service->getStatusData($id); + + return ResponseComposer::json($result); + } +} diff --git a/application/Espo/Controllers/MassAction.php b/application/Espo/Core/MassAction/Api/PostProcess.php similarity index 77% rename from application/Espo/Controllers/MassAction.php rename to application/Espo/Core/MassAction/Api/PostProcess.php index eb91cd448b..e9ee1f08ff 100644 --- a/application/Espo/Controllers/MassAction.php +++ b/application/Espo/Core/MassAction/Api/PostProcess.php @@ -27,37 +27,31 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\Controllers; - -use Espo\Core\Exceptions\BadRequest; -use Espo\Core\Exceptions\Error; - -use Espo\Core\MassAction\Service; -use Espo\Core\MassAction\ServiceResult; -use Espo\Core\MassAction\Params; -use Espo\Core\MassAction\ServiceParams; +namespace Espo\Core\MassAction\Api; +use Espo\Core\Api\Action; use Espo\Core\Api\Request; use Espo\Core\Api\Response; - +use Espo\Core\Api\ResponseComposer; +use Espo\Core\Exceptions\BadRequest; +use Espo\Core\Exceptions\Error; +use Espo\Core\MassAction\Params; +use Espo\Core\MassAction\Service; +use Espo\Core\MassAction\ServiceParams; +use Espo\Core\MassAction\ServiceResult; use Espo\Core\Utils\Json; - -use stdClass; use RuntimeException; +use stdClass; /** - * Mass-Action framework. + * Processes mass actions. */ -class MassAction +class PostProcess implements Action { - private $service; + public function __construct(private Service $service) + {} - public function __construct(Service $service) - { - $this->service = $service; - } - - public function postActionProcess(Request $request): stdClass + public function process(Request $request): Response { $body = $request->getParsedBody(); @@ -90,35 +84,13 @@ class MassAction $data ); - return $this->convertResult($result); - } + $result = $this->convertResult($result); - public function getActionStatus(Request $request): stdClass - { - $id = $request->getQueryParam('id'); - - if (!$id) { - throw new BadRequest(); - } - - return $this->service->getStatusData($id); - } - - public function postActionSubscribeToNotificationOnSuccess(Request $request, Response $response): void - { - $id = $request->getParsedBody()->id ?? null; - - if (!$id || !is_string($id)) { - throw new BadRequest(); - } - - $this->service->subscribeToNotificationOnSuccess($id); - - $response->writeBody('true'); + return ResponseComposer::json($result); } /** - * @return array + * @return array * @throws BadRequest */ private function prepareMassActionParams(stdClass $data): array @@ -141,13 +113,11 @@ class MassAction return $params; } - if (!is_null($ids)) { - return [ - 'ids' => $ids, - ]; + if (is_null($ids)) { + throw new BadRequest("Bad search params for mass action."); } - throw new BadRequest("Bad search params for mass action."); + return ['ids' => $ids]; } /** diff --git a/application/Espo/Core/MassAction/Api/PostSubscribe.php b/application/Espo/Core/MassAction/Api/PostSubscribe.php new file mode 100644 index 0000000000..6efeddc93c --- /dev/null +++ b/application/Espo/Core/MassAction/Api/PostSubscribe.php @@ -0,0 +1,56 @@ +getRouteParam('id'); + + if (!$id) { + throw new BadRequest(); + } + + $this->service->subscribeToNotificationOnSuccess($id); + + return ResponseComposer::json(true); + } +} diff --git a/application/Espo/Resources/routes.json b/application/Espo/Resources/routes.json index 259c9df504..b9143fcd78 100644 --- a/application/Espo/Resources/routes.json +++ b/application/Espo/Resources/routes.json @@ -228,29 +228,35 @@ "name": ":name" } }, + { + "route": "/CurrencyRate", + "method": "get", + "actionClassName": "Espo\\Tools\\Currency\\Api\\Get" + }, { "route": "/CurrencyRate", "method": "put", - "params": { - "controller": "CurrencyRate", - "action": "update" - } + "actionClassName": "Espo\\Tools\\Currency\\Api\\PutUpdate" }, { "route": "/Action", "method": "post", - "params": { - "controller": "Action", - "action": "process" - } + "actionClassName": "Espo\\Core\\Action\\Api\\PostProcess" }, { "route": "/MassAction", "method": "post", - "params": { - "controller": "MassAction", - "action": "process" - } + "actionClassName": "Espo\\Core\\MassAction\\Api\\PostProcess" + }, + { + "route": "/MassAction/:id/status", + "method": "get", + "actionClassName": "Espo\\Core\\MassAction\\Api\\GetStatus" + }, + { + "route": "/MassAction/:id/subscribe", + "method": "post", + "actionClassName": "Espo\\Core\\MassAction\\Api\\PostSubscribe" }, { "route": "/Export", diff --git a/application/Espo/Tools/Currency/Api/Get.php b/application/Espo/Tools/Currency/Api/Get.php new file mode 100644 index 0000000000..4091e7d0fa --- /dev/null +++ b/application/Espo/Tools/Currency/Api/Get.php @@ -0,0 +1,52 @@ +service->get()->toAssoc(); + + return ResponseComposer::json($result); + } +} diff --git a/application/Espo/Controllers/CurrencyRate.php b/application/Espo/Tools/Currency/Api/PutUpdate.php similarity index 79% rename from application/Espo/Controllers/CurrencyRate.php rename to application/Espo/Tools/Currency/Api/PutUpdate.php index ed5d4c01b1..ef205f9fe7 100644 --- a/application/Espo/Controllers/CurrencyRate.php +++ b/application/Espo/Tools/Currency/Api/PutUpdate.php @@ -27,33 +27,24 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\Controllers; +namespace Espo\Tools\Currency\Api; -use Espo\Core\Currency\Rates; -use Espo\Core\Exceptions\BadRequest; -use Espo\Core\Exceptions\Forbidden; -use Espo\Tools\Currency\RateService as Service; +use Espo\Core\Api\Action; use Espo\Core\Api\Request; -use stdClass; +use Espo\Core\Api\Response; +use Espo\Core\Api\ResponseComposer; +use Espo\Core\Currency\Rates; +use Espo\Tools\Currency\RateService as Service; -class CurrencyRate +/** + * Updates rates. + */ +class PutUpdate implements Action { public function __construct(private Service $service) {} - /** - * @throws Forbidden - */ - public function getActionIndex(): stdClass - { - return (object) $this->service->get()->toAssoc(); - } - - /** - * @throws BadRequest - * @throws Forbidden - */ - public function putActionUpdate(Request $request): bool + public function process(Request $request): Response { $data = $request->getParsedBody(); @@ -61,6 +52,6 @@ class CurrencyRate $this->service->set($rates); - return true; + return ResponseComposer::json(true); } } diff --git a/client/src/views/modals/mass-action.js b/client/src/views/modals/mass-action.js index 8862e8d956..ae3a0f6c08 100644 --- a/client/src/views/modals/mass-action.js +++ b/client/src/views/modals/mass-action.js @@ -114,9 +114,7 @@ define('views/modals/mass-action', ['views/modal', 'model'], function (Dep, Mode return; } - Espo.Ajax.postRequest('MassAction/action/subscribeToNotificationOnSuccess', { - id: this.id, - }); + Espo.Ajax.postRequest(`MassAction/${this.id}/subscribe`); }); this.checkStatus(); @@ -124,9 +122,7 @@ define('views/modals/mass-action', ['views/modal', 'model'], function (Dep, Mode checkStatus: function () { Espo.Ajax - .getRequest('MassAction/action/status', { - id: this.id, - }) + .getRequest(`MassAction/${this.id}/status`) .then(response => { let status = response.status;