From e28ec274e0788524e769abee0be6a19674e9062f Mon Sep 17 00:00:00 2001 From: nuxsmin Date: Thu, 9 Aug 2018 13:43:02 +0200 Subject: [PATCH] * [FIX] Wrong behavior when searching for items through the API. Thanks to @GGOUSSEAUD for the feedback and testing. Related #1000 * [MOD] Improved API help. Related #1004 * [MOD] Code refactoring --- .../api/Controllers/AccountController.php | 23 ++-- .../api/Controllers/CategoryController.php | 31 +++-- .../api/Controllers/ClientController.php | 25 ++-- .../api/Controllers/ConfigController.php | 36 +++-- .../api/Controllers/ControllerBase.php | 15 +- .../api/Controllers/Help/AccountHelp.php | 106 ++++++++++++++ .../api/Controllers/Help/CategoryHelp.php | 81 +++++++++++ .../api/Controllers/Help/ClientHelp.php | 82 +++++++++++ .../api/Controllers/Help/ConfigHelp.php | 57 ++++++++ .../api/Controllers/Help/HelpInterface.php | 40 ++++++ .../api/Controllers/Help/HelpTrait.php | 65 +++++++++ app/modules/api/Controllers/Help/TagHelp.php | 80 +++++++++++ app/modules/api/Controllers/TagController.php | 29 ++-- lib/SP/Bootstrap.php | 3 +- lib/SP/Services/Api/ApiService.php | 129 +++--------------- lib/SP/Services/Install/Installer.php | 2 +- 16 files changed, 621 insertions(+), 183 deletions(-) create mode 100644 app/modules/api/Controllers/Help/AccountHelp.php create mode 100644 app/modules/api/Controllers/Help/CategoryHelp.php create mode 100644 app/modules/api/Controllers/Help/ClientHelp.php create mode 100644 app/modules/api/Controllers/Help/ConfigHelp.php create mode 100644 app/modules/api/Controllers/Help/HelpInterface.php create mode 100644 app/modules/api/Controllers/Help/HelpTrait.php create mode 100644 app/modules/api/Controllers/Help/TagHelp.php diff --git a/app/modules/api/Controllers/AccountController.php b/app/modules/api/Controllers/AccountController.php index 5f60c451..9f77e497 100644 --- a/app/modules/api/Controllers/AccountController.php +++ b/app/modules/api/Controllers/AccountController.php @@ -28,6 +28,7 @@ use SP\Core\Acl\ActionsInterface; use SP\Core\Crypt\Crypt; use SP\Core\Events\Event; use SP\Core\Events\EventMessage; +use SP\Modules\Api\Controllers\Help\AccountHelp; use SP\Services\Account\AccountRequest; use SP\Services\Account\AccountSearchFilter; use SP\Services\Account\AccountService; @@ -43,7 +44,7 @@ final class AccountController extends ControllerBase /** * @var AccountService */ - protected $accountService; + private $accountService; /** * viewAction @@ -98,9 +99,9 @@ final class AccountController extends ControllerBase $this->returnResponse(new ApiResponse(["itemId" => $accountId, "password" => $password])); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -145,9 +146,9 @@ final class AccountController extends ControllerBase $this->returnResponse(new ApiResponse(__('Cuenta creada'), ApiResponse::RESULT_SUCCESS, $accountId)); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -168,9 +169,9 @@ final class AccountController extends ControllerBase $this->returnResponse(new ApiResponse($this->accountService->getByFilter($accountSearchFilter))); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -197,18 +198,18 @@ final class AccountController extends ControllerBase $this->returnResponse(new ApiResponse(__u('Cuenta eliminada'), ApiResponse::RESULT_SUCCESS, $accountId)); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } /** - * @throws \DI\DependencyException - * @throws \DI\NotFoundException + * @throws \SP\Core\Exceptions\InvalidClassException */ protected function initialize() { $this->accountService = $this->dic->get(AccountService::class); + $this->apiService->setHelpClass(AccountHelp::class); } } \ No newline at end of file diff --git a/app/modules/api/Controllers/CategoryController.php b/app/modules/api/Controllers/CategoryController.php index 70bf0e65..fd5902a5 100644 --- a/app/modules/api/Controllers/CategoryController.php +++ b/app/modules/api/Controllers/CategoryController.php @@ -29,6 +29,7 @@ use SP\Core\Events\Event; use SP\Core\Events\EventMessage; use SP\DataModel\CategoryData; use SP\DataModel\ItemSearchData; +use SP\Modules\Api\Controllers\Help\CategoryHelp; use SP\Services\Api\ApiResponse; use SP\Services\Category\CategoryService; @@ -43,7 +44,7 @@ final class CategoryController extends ControllerBase /** * @var CategoryService */ - protected $categoryService; + private $categoryService; /** * viewAction @@ -62,9 +63,9 @@ final class CategoryController extends ControllerBase $this->returnResponse(new ApiResponse($categoryData)); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -90,9 +91,9 @@ final class CategoryController extends ControllerBase $this->returnResponse(new ApiResponse(__('Categoría creada'), ApiResponse::RESULT_SUCCESS, $id)); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -119,9 +120,9 @@ final class CategoryController extends ControllerBase $this->returnResponse(new ApiResponse(__('Categoría actualizada'), ApiResponse::RESULT_SUCCESS, $categoryData->getId())); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -147,9 +148,9 @@ final class CategoryController extends ControllerBase $this->returnResponse(new ApiResponse(__('Categoría eliminada'), ApiResponse::RESULT_SUCCESS, $id)); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -167,20 +168,22 @@ final class CategoryController extends ControllerBase $this->eventDispatcher->notifyEvent('search.category', new Event($this)); - $this->returnResponse(new ApiResponse($this->categoryService->search($itemSearchData))); + $this->returnResponse(new ApiResponse($this->categoryService->search($itemSearchData)->getDataAsArray())); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } /** - * @throws \DI\DependencyException - * @throws \DI\NotFoundException + * initialize + * + * @throws \SP\Core\Exceptions\InvalidClassException */ protected function initialize() { $this->categoryService = $this->dic->get(CategoryService::class); + $this->apiService->setHelpClass(CategoryHelp::class); } } \ No newline at end of file diff --git a/app/modules/api/Controllers/ClientController.php b/app/modules/api/Controllers/ClientController.php index 4015ee9f..46291847 100644 --- a/app/modules/api/Controllers/ClientController.php +++ b/app/modules/api/Controllers/ClientController.php @@ -29,6 +29,7 @@ use SP\Core\Events\Event; use SP\Core\Events\EventMessage; use SP\DataModel\ClientData; use SP\DataModel\ItemSearchData; +use SP\Modules\Api\Controllers\Help\ClientHelp; use SP\Services\Api\ApiResponse; use SP\Services\Client\ClientService; @@ -42,7 +43,7 @@ final class ClientController extends ControllerBase /** * @var ClientService */ - protected $clientService; + private $clientService; /** * viewAction @@ -59,9 +60,9 @@ final class ClientController extends ControllerBase $this->returnResponse(new ApiResponse($client)); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -88,9 +89,9 @@ final class ClientController extends ControllerBase $this->returnResponse(new ApiResponse(__('Cliente creado'), ApiResponse::RESULT_SUCCESS, $clientId)); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -118,9 +119,9 @@ final class ClientController extends ControllerBase $this->returnResponse(new ApiResponse(__('Cliente actualizado'), ApiResponse::RESULT_SUCCESS, $clientData->getId())); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -166,20 +167,20 @@ final class ClientController extends ControllerBase $this->eventDispatcher->notifyEvent('search.client', new Event($this)); - $this->returnResponse(new ApiResponse($this->clientService->search($itemSearchData))); + $this->returnResponse(new ApiResponse($this->clientService->search($itemSearchData)->getDataAsArray())); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } /** - * @throws \DI\DependencyException - * @throws \DI\NotFoundException + * @throws \SP\Core\Exceptions\InvalidClassException */ protected function initialize() { $this->clientService = $this->dic->get(ClientService::class); + $this->apiService->setHelpClass(ClientHelp::class); } } \ No newline at end of file diff --git a/app/modules/api/Controllers/ConfigController.php b/app/modules/api/Controllers/ConfigController.php index 578b0353..53e29748 100644 --- a/app/modules/api/Controllers/ConfigController.php +++ b/app/modules/api/Controllers/ConfigController.php @@ -27,6 +27,7 @@ namespace SP\Modules\Api\Controllers; use SP\Core\Acl\ActionsInterface; use SP\Core\Events\Event; use SP\Core\Events\EventMessage; +use SP\Modules\Api\Controllers\Help\ConfigHelp; use SP\Services\Api\ApiResponse; use SP\Services\Backup\FileBackupService; use SP\Services\Export\XmlExportService; @@ -40,36 +41,33 @@ final class ConfigController extends ControllerBase { /** * backupAction - * - * @throws \Psr\Container\ContainerExceptionInterface - * @throws \Psr\Container\NotFoundExceptionInterface */ public function backupAction() { try { $this->setupApi(ActionsInterface::CONFIG_BACKUP); + $path = $this->apiService->getParamString('path', false, BACKUP_PATH); + $this->dic->get(FileBackupService::class) - ->doBackup(BACKUP_PATH); + ->doBackup($path); $this->eventDispatcher->notifyEvent('run.backup.end', new Event($this, EventMessage::factory() - ->addDescription(__u('Copia de la aplicación y base de datos realizada correctamente'))) + ->addDescription(__u('Copia de la aplicación y base de datos realizada correctamente')) + ->addDetail(__u('Ruta'), $path)) ); $this->returnResponse(new ApiResponse(__u('Proceso de backup finalizado'))); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } /** * exportAction - * - * @throws \Psr\Container\ContainerExceptionInterface - * @throws \Psr\Container\NotFoundExceptionInterface */ public function exportAction() { @@ -77,14 +75,16 @@ final class ConfigController extends ControllerBase $this->setupApi(ActionsInterface::CONFIG_EXPORT); $password = $this->apiService->getParamString('password'); + $path = $this->apiService->getParamString('path', false, BACKUP_PATH); $this->eventDispatcher->notifyEvent('run.export.start', new Event($this, EventMessage::factory() - ->addDescription(__u('Exportación de sysPass en XML'))) + ->addDescription(__u('Exportación de sysPass en XML')) + ->addDetail(__u('Ruta'), $path)) ); $this->dic->get(XmlExportService::class) - ->doExport(BACKUP_PATH, $password); + ->doExport($path, $password); $this->eventDispatcher->notifyEvent('run.export.end', new Event($this, EventMessage::factory() @@ -93,9 +93,17 @@ final class ConfigController extends ControllerBase $this->returnResponse(new ApiResponse(__u('Proceso de exportación finalizado'))); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } + + /** + * @throws \SP\Core\Exceptions\InvalidClassException + */ + protected function initialize() + { + $this->apiService->setHelpClass(ConfigHelp::class); + } } \ No newline at end of file diff --git a/app/modules/api/Controllers/ControllerBase.php b/app/modules/api/Controllers/ControllerBase.php index 26c489b0..c41f674a 100644 --- a/app/modules/api/Controllers/ControllerBase.php +++ b/app/modules/api/Controllers/ControllerBase.php @@ -26,6 +26,7 @@ namespace SP\Modules\Api\Controllers; use DI\Container; use Klein\Klein; +use Psr\Container\ContainerInterface; use SP\Core\Context\StatelessContext; use SP\Core\Events\EventDispatcher; use SP\Core\Exceptions\SPException; @@ -42,7 +43,7 @@ abstract class ControllerBase { const SEARCH_COUNT_ITEMS = 25; /** - * @var Container + * @var ContainerInterface */ protected $dic; /** @@ -120,7 +121,7 @@ abstract class ControllerBase /** * @param int $actionId * - * @throws \Exception + * @throws SPException * @throws \SP\Services\ServiceException */ final protected function setupApi($actionId) @@ -136,8 +137,6 @@ abstract class ControllerBase * {"jsonrpc": "2.0", "result": 19, "id": 3} * * @param \SP\Services\Api\ApiResponse $apiResponse - * - * @return string La cadena en formato JSON */ final protected function returnResponse(ApiResponse $apiResponse) { @@ -149,24 +148,22 @@ abstract class ControllerBase $this->router->response()->headers()->set('Content-type', 'application/json; charset=utf-8'); $this->router->response()->send(true); - exit(JsonRpcResponse::getResponse($apiResponse, $this->apiService->getRequestId())); + echo JsonRpcResponse::getResponse($apiResponse, $this->apiService->getRequestId()); } catch (SPException $e) { processException($e); - exit(JsonRpcResponse::getResponseException($e, $this->apiService->getRequestId())); + echo JsonRpcResponse::getResponseException($e, $this->apiService->getRequestId()); } } /** * @param \Exception $e - * - * @return string */ final protected function returnResponseException(\Exception $e) { $this->router->response()->headers()->set('Content-type', 'application/json; charset=utf-8'); $this->router->response()->send(true); - exit(JsonRpcResponse::getResponseException($e, $this->apiService->getRequestId())); + echo JsonRpcResponse::getResponseException($e, $this->apiService->getRequestId()); } } \ No newline at end of file diff --git a/app/modules/api/Controllers/Help/AccountHelp.php b/app/modules/api/Controllers/Help/AccountHelp.php new file mode 100644 index 00000000..84f47526 --- /dev/null +++ b/app/modules/api/Controllers/Help/AccountHelp.php @@ -0,0 +1,106 @@ +. + */ + +namespace SP\Modules\Api\Controllers\Help; + +/** + * Class AccountHelp + * + * @package SP\Modules\Api\Controllers\Help + */ +class AccountHelp implements HelpInterface +{ + use HelpTrait; + + /** + * @return array + */ + public static function view() + { + return + [ + self::getItem('id', __('Id de la cuenta'), true) + ]; + } + + /** + * @return array + */ + public static function viewPass() + { + return + [ + self::getItem('id', __('Id de la cuenta'), true), + self::getItem('tokenPass', __('Clave del token'), true), + self::getItem('details', __('Devolver detalles en la respuesta')) + ]; + } + + /** + * @return array + */ + public static function create() + { + return + [ + self::getItem('tokenPass', __('Clave del token'), true), + self::getItem('name', __('Nombre de cuenta', true)), + self::getItem('categoryId', __('Id de categoría'), true), + self::getItem('clientId', __('Id de cliente'), true), + self::getItem('pass', __('Clave'), true), + self::getItem('login', __('Usuario de acceso')), + self::getItem('url', __('URL o IP de acceso')), + self::getItem('notes', __('Notas sobre la cuenta')), + self::getItem('private', __('Cuenta Privada')), + self::getItem('privateGroup', __('Cuenta Privada Grupo')), + self::getItem('expireDate', __('Fecha Caducidad Clave')), + self::getItem('parentId', __('Cuenta Vinculada')) + ]; + } + + /** + * @return array + */ + public static function search() + { + return + [ + self::getItem('text', __('Texto a buscar')), + self::getItem('count', __('Número de resultados a mostrar')), + self::getItem('categoryId', __('Id de categoría a filtrar')), + self::getItem('clientId', __('Id de cliente a filtrar')) + ]; + } + + /** + * @return array + */ + public static function delete() + { + return + [ + self::getItem('id', __('Id de la cuenta'), true) + ]; + } +} \ No newline at end of file diff --git a/app/modules/api/Controllers/Help/CategoryHelp.php b/app/modules/api/Controllers/Help/CategoryHelp.php new file mode 100644 index 00000000..2c7f5412 --- /dev/null +++ b/app/modules/api/Controllers/Help/CategoryHelp.php @@ -0,0 +1,81 @@ +. + */ + +namespace SP\Modules\Api\Controllers\Help; + +/** + * Class CategoryHelp + * + * @package SP\Modules\Api\Controllers\Help + */ +class CategoryHelp implements HelpInterface +{ + use HelpTrait; + + /** + * @return array + */ + public static function view() + { + return + [ + self::getItem('id', __('Id de categoría'), true) + ]; + } + + /** + * @return array + */ + public static function create() + { + return + [ + self::getItem('name', __('Nombre de la categoría'), true), + self::getItem('description', __('Descripción de la categoría')) + ]; + } + + /** + * @return array + */ + public static function search() + { + return + [ + self::getItem('text', __('Texto a buscar')), + self::getItem('count', __('Número de resultados a mostrar')) + ]; + } + + /** + * @return array + */ + public static function delete() + { + return + [ + self::getItem('id', __('Id de categoría'), true) + ]; + } +} \ No newline at end of file diff --git a/app/modules/api/Controllers/Help/ClientHelp.php b/app/modules/api/Controllers/Help/ClientHelp.php new file mode 100644 index 00000000..4c3cec04 --- /dev/null +++ b/app/modules/api/Controllers/Help/ClientHelp.php @@ -0,0 +1,82 @@ +. + */ + +namespace SP\Modules\Api\Controllers\Help; + +/** + * Class ClientHelp + * + * @package SP\Modules\Api\Controllers\Help + */ +class ClientHelp implements HelpInterface +{ + use HelpTrait; + + /** + * @return array + */ + public static function view() + { + return + [ + self::getItem('id', __('Id de cliente'), true) + ]; + } + + /** + * @return array + */ + public static function create() + { + return + [ + self::getItem('name', __('Nombre del cliente'), true), + self::getItem('description', __('Descripción del cliente')), + self::getItem('global', __('Global')) + ]; + } + + /** + * @return array + */ + public static function search() + { + return + [ + self::getItem('text', __('Texto a buscar')), + self::getItem('count', __('Número de resultados a mostrar')) + ]; + } + + /** + * @return array + */ + public static function delete() + { + return + [ + self::getItem('id', __('Id de cliente'), true) + ]; + } +} \ No newline at end of file diff --git a/app/modules/api/Controllers/Help/ConfigHelp.php b/app/modules/api/Controllers/Help/ConfigHelp.php new file mode 100644 index 00000000..75155eb7 --- /dev/null +++ b/app/modules/api/Controllers/Help/ConfigHelp.php @@ -0,0 +1,57 @@ +. + */ + +namespace SP\Modules\Api\Controllers\Help; + +/** + * Class ConfigHelp + * + * @package SP\Modules\Api\Controllers\Help + */ +class ConfigHelp implements HelpInterface +{ + use HelpTrait; + + /** + * @return array + */ + public static function backup() + { + return + [ + self::getItem('path', __('Ruta')) + ]; + } + + /** + * @return array + */ + public static function export() + { + return + [ + self::getItem('path', __('Ruta')) + ]; + } +} \ No newline at end of file diff --git a/app/modules/api/Controllers/Help/HelpInterface.php b/app/modules/api/Controllers/Help/HelpInterface.php new file mode 100644 index 00000000..7b48a43b --- /dev/null +++ b/app/modules/api/Controllers/Help/HelpInterface.php @@ -0,0 +1,40 @@ +. + */ + +namespace SP\Modules\Api\Controllers\Help; + +/** + * Interface HelpInterface + * + * @package SP\Modules\Api\Controllers\Help + */ +interface HelpInterface +{ + /** + * @param string $action + * + * @return array + */ + public static function getHelpFor(string $action): array; +} \ No newline at end of file diff --git a/app/modules/api/Controllers/Help/HelpTrait.php b/app/modules/api/Controllers/Help/HelpTrait.php new file mode 100644 index 00000000..86837e71 --- /dev/null +++ b/app/modules/api/Controllers/Help/HelpTrait.php @@ -0,0 +1,65 @@ +. + */ + +namespace SP\Modules\Api\Controllers\Help; + +/** + * Trait HelpTrait + * + * @package SP\Modules\Api\Controllers\Help + */ +trait HelpTrait +{ + /** + * @param string $action + * + * @return array + */ + public static function getHelpFor(string $action): array + { + if (strpos($action, '/') !== false) { + list(, $action) = explode('/', $action); + } + + if (method_exists(static::class, $action)) { + return [ + 'help' => static::$action() + ]; + } + + return []; + } + + /** + * @param string $name + * @param string $description + * @param bool $required + * + * @return array + */ + private static function getItem(string $name, string $description, bool $required = false): array + { + return [$name => ['description' => $description, 'required' => $required]]; + } +} \ No newline at end of file diff --git a/app/modules/api/Controllers/Help/TagHelp.php b/app/modules/api/Controllers/Help/TagHelp.php new file mode 100644 index 00000000..c9af3083 --- /dev/null +++ b/app/modules/api/Controllers/Help/TagHelp.php @@ -0,0 +1,80 @@ +. + */ + +namespace SP\Modules\Api\Controllers\Help; + +/** + * Class TagHelp + * + * @package SP\Modules\Api\Controllers\Help + */ +class TagHelp implements HelpInterface +{ + use HelpTrait; + + /** + * @return array + */ + public static function view() + { + return + [ + self::getItem('id', __('Id de etiqueta'), true) + ]; + } + + /** + * @return array + */ + public static function create() + { + return + [ + self::getItem('name', __('Nombre de la etiqueta'), true) + ]; + } + + /** + * @return array + */ + public static function search() + { + return + [ + self::getItem('text', __('Texto a buscar')), + self::getItem('count', __('Número de resultados a mostrar')) + ]; + } + + /** + * @return array + */ + public static function delete() + { + return + [ + self::getItem('id', __('Id de etiqueta'), true) + ]; + } +} \ No newline at end of file diff --git a/app/modules/api/Controllers/TagController.php b/app/modules/api/Controllers/TagController.php index 91e1fac3..dc2cc542 100644 --- a/app/modules/api/Controllers/TagController.php +++ b/app/modules/api/Controllers/TagController.php @@ -29,6 +29,7 @@ use SP\Core\Events\Event; use SP\Core\Events\EventMessage; use SP\DataModel\ItemSearchData; use SP\DataModel\TagData; +use SP\Modules\Api\Controllers\Help\TagHelp; use SP\Services\Api\ApiResponse; use SP\Services\Tag\TagService; @@ -42,7 +43,7 @@ final class TagController extends ControllerBase /** * @var TagService */ - protected $tagService; + private $tagService; /** * viewAction @@ -58,9 +59,9 @@ final class TagController extends ControllerBase $this->returnResponse(new ApiResponse($this->tagService->getById($id))); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -85,9 +86,9 @@ final class TagController extends ControllerBase $this->returnResponse(new ApiResponse(__('Etiqueta creada'), ApiResponse::RESULT_SUCCESS, $id)); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -113,9 +114,9 @@ final class TagController extends ControllerBase $this->returnResponse(new ApiResponse(__('Etiqueta actualizada'), ApiResponse::RESULT_SUCCESS, $tagData->getId())); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -141,9 +142,9 @@ final class TagController extends ControllerBase $this->returnResponse(new ApiResponse(__('Etiqueta eliminada'), ApiResponse::RESULT_SUCCESS, $id)); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } @@ -161,20 +162,20 @@ final class TagController extends ControllerBase $this->eventDispatcher->notifyEvent('search.tag', new Event($this)); - $this->returnResponse(new ApiResponse($this->tagService->search($itemSearchData))); + $this->returnResponse(new ApiResponse($this->tagService->search($itemSearchData)->getDataAsArray())); } catch (\Exception $e) { - $this->returnResponseException($e); - processException($e); + + $this->returnResponseException($e); } } /** - * @throws \DI\DependencyException - * @throws \DI\NotFoundException + * @throws \SP\Core\Exceptions\InvalidClassException */ protected function initialize() { $this->tagService = $this->dic->get(TagService::class); + $this->apiService->setHelpClass(TagHelp::class); } } \ No newline at end of file diff --git a/lib/SP/Bootstrap.php b/lib/SP/Bootstrap.php index ea174749..f44c801e 100644 --- a/lib/SP/Bootstrap.php +++ b/lib/SP/Bootstrap.php @@ -172,13 +172,14 @@ final class Bootstrap /** @var Response $response */ $response->headers()->set('Content-type', 'application/json; charset=utf-8'); return $response->body(JsonRpcResponse::getResponseException($e, 0)); + } } ); // Manejar URLs de módulo web $this->router->respond(['GET', 'POST'], - '@/(index\.php)?', + '@/index\.php', function ($request, $response, $service) use ($oops) { try { /** @var \Klein\Request $request */ diff --git a/lib/SP/Services/Api/ApiService.php b/lib/SP/Services/Api/ApiService.php index 111f7059..b90b3c28 100644 --- a/lib/SP/Services/Api/ApiService.php +++ b/lib/SP/Services/Api/ApiService.php @@ -28,7 +28,9 @@ use Defuse\Crypto\Exception\CryptoException; use SP\Core\Acl\ActionsInterface; use SP\Core\Crypt\Hash; use SP\Core\Crypt\Vault; +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\AuthTokenData; +use SP\Modules\Api\Controllers\Help\HelpInterface; use SP\Repositories\Track\TrackRequest; use SP\Services\AuthToken\AuthTokenService; use SP\Services\Service; @@ -65,6 +67,10 @@ final class ApiService extends Service * @var AuthTokenData */ private $authTokenData; + /** + * @var HelpInterface + */ + private $helpClass; /** * @var bool */ @@ -165,113 +171,7 @@ final class ApiService extends Service */ public function getHelp($action) { - return $this->getActions()[$action]['help']; - } - - /** - * Devuelve las acciones que implementa la API - * - * @return array - */ - public function getActions() - { - return [ - 'account/viewPass' => [ - 'help' => [ - 'id' => __('Id de la cuenta'), - 'tokenPass' => __('Clave del token'), - 'details' => __('Devolver detalles en la respuesta') - ] - ], - 'account/search' => [ - 'help' => [ - 'text' => __('Texto a buscar'), - 'count' => __('Número de resultados a mostrar'), - 'categoryId' => __('Id de categoría a filtrar'), - 'clientId' => __('Id de cliente a filtrar') - ] - ], - 'account/view' => [ - 'help' => [ - 'id' => __('Id de la cuenta') - ] - ], - 'account/delete' => [ - 'help' => [ - 'id' => __('Id de la cuenta') - ] - ], - 'account/create' => [ - 'help' => [ - 'tokenPass' => __('Clave del token'), - 'name' => __('Nombre de cuenta'), - 'categoryId' => __('Id de categoría'), - 'clientId' => __('Id de cliente'), - 'pass' => __('Clave'), - 'login' => __('Usuario de acceso'), - 'url' => __('URL o IP de acceso'), - 'notes' => __('Notas sobre la cuenta'), - 'private' => __('Cuenta Privada'), - 'privateGroup' => __('Cuenta Privada Grupo'), - 'expireDate' => __('Fecha Caducidad Clave'), - 'parentId' => __('Cuenta Vinculada') - ] - ], - 'backup' => [ - 'help' => '' - ], - 'category/search' => [ - 'help' => [ - 'text' => __('Texto a buscar'), - 'count' => __('Número de resultados a mostrar') - ] - ], - 'category/create' => [ - 'help' => [ - 'name' => __('Nombre de la categoría'), - 'description' => __('Descripción de la categoría') - ] - ], - 'category/delete' => [ - 'help' => [ - 'id' => __('Id de categoría') - ] - ], - 'client/search' => [ - 'help' => [ - 'text' => __('Texto a buscar'), - 'count' => __('Número de resultados a mostrar') - ] - ], - 'client/create' => [ - 'help' => [ - 'name' => __('Nombre del cliente'), - 'description' => __('Descripción del cliente'), - 'global' => __('Global') - ] - ], - 'client/delete' => [ - 'help' => [ - 'id' => __('Id de cliente') - ] - ], - 'tag/search' => [ - 'help' => [ - 'text' => __('Texto a buscar'), - 'count' => __('Número de resultados a mostrar') - ] - ], - 'tag/create' => [ - 'help' => [ - 'name' => __('Nombre de la etiqueta') - ] - ], - 'tag/delete' => [ - 'help' => [ - 'id' => __('Id de etiqueta') - ] - ] - ]; + return call_user_func([$this->helpClass, 'getHelpFor'], $action); } /** @@ -428,6 +328,21 @@ final class ApiService extends Service return $this->initialized; } + /** + * @param string $helpClass + * + * @throws InvalidClassException + */ + public function setHelpClass(string $helpClass) + { + if (class_exists($helpClass)) { + $this->helpClass = $helpClass; + return; + } + + throw new InvalidClassException('Invalid class for helper'); + } + /** * @throws \SP\Core\Exceptions\InvalidArgumentException */ diff --git a/lib/SP/Services/Install/Installer.php b/lib/SP/Services/Install/Installer.php index 8758e15a..e374476c 100644 --- a/lib/SP/Services/Install/Installer.php +++ b/lib/SP/Services/Install/Installer.php @@ -55,7 +55,7 @@ final class Installer extends Service */ const VERSION = [3, 0, 0]; const VERSION_TEXT = '3.0-beta'; - const BUILD = 18080901; + const BUILD = 18080902; /** * @var DatabaseSetupInterface