diff --git a/app/modules/web/Controllers/AccessManagerController.php b/app/modules/web/Controllers/AccessManagerController.php index d7033cba..3c588e55 100644 --- a/app/modules/web/Controllers/AccessManagerController.php +++ b/app/modules/web/Controllers/AccessManagerController.php @@ -61,7 +61,6 @@ class AccessManagerController extends ControllerBase * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface * @throws \SP\Core\Dic\ContainerException - * @throws \SP\Core\Exceptions\InvalidArgumentException */ public function indexAction() { @@ -74,7 +73,6 @@ class AccessManagerController extends ControllerBase * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface * @throws \SP\Core\Dic\ContainerException - * @throws \SP\Core\Exceptions\InvalidArgumentException */ protected function getGridTabs() { diff --git a/app/modules/web/Controllers/AccountController.php b/app/modules/web/Controllers/AccountController.php index 4c5b2edf..bf273354 100644 --- a/app/modules/web/Controllers/AccountController.php +++ b/app/modules/web/Controllers/AccountController.php @@ -30,6 +30,7 @@ use SP\Core\Acl\Acl; use SP\Core\Acl\ActionsInterface; use SP\Core\Crypt\Vault; use SP\Core\Events\Event; +use SP\Core\Events\EventMessage; use SP\Core\Exceptions\SPException; use SP\Core\Exceptions\ValidationException; use SP\Core\SessionUtil; @@ -46,6 +47,7 @@ use SP\Modules\Web\Controllers\Traits\JsonTrait; use SP\Mvc\Controller\CrudControllerInterface; use SP\Services\Account\AccountHistoryService; use SP\Services\Account\AccountService; +use SP\Services\Auth\AuthException; use SP\Services\PublicLink\PublicLinkService; use SP\Util\ErrorUtil; use SP\Util\ImageUtil; @@ -222,7 +224,12 @@ class AccountController extends ControllerBase implements CrudControllerInterfac $this->view->assign('accountData', $accountData); - $this->eventDispatcher->notifyEvent('show.account.link', new Event($this)); + $this->eventDispatcher->notifyEvent('show.account.link', new Event($this, + EventMessage::factory() + ->addDescription(__('Enlace visualizado')) + ->addDetail(__('Cuenta'), $accountData->getName()) + ->addDetail(__('Cliente'), $accountData->getClientName())) + ); } else { ErrorUtil::showErrorFull($this->view, ErrorUtil::ERR_PAGE_NO_PERMISSION, 'account-link'); } @@ -491,7 +498,7 @@ class AccountController extends ControllerBase implements CrudControllerInterfac /** * Display account's password * - * @param int $id Account's ID + * @param int $id Account's ID * @param int $isHistory The account's ID refers to history * @throws \Psr\Container\ContainerExceptionInterface */ @@ -509,27 +516,31 @@ class AccountController extends ControllerBase implements CrudControllerInterfac 'html' => $this->render() ]; - $this->eventDispatcher->notifyEvent('show.account.pass', new Event($this)); + $this->eventDispatcher->notifyEvent('show.account.pass', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Clave visualizada')) + ->addDetail(__u('Cuenta'), $account->getName())) + ); $this->returnJsonResponseData($data); } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, $e->getMessage()); + $this->returnJsonResponseException($e); } } /** * Copy account's password * - * @param int $id Account's ID + * @param int $id Account's ID * @param int $isHistory The account's ID refers to history * @throws Helpers\HelperException * @throws SPException * @throws \Defuse\Crypto\Exception\CryptoException * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface - * @throws \SP\Core\Exceptions\InvalidArgumentException */ public function copyPassAction($id, $isHistory) { @@ -541,15 +552,18 @@ class AccountController extends ControllerBase implements CrudControllerInterfac 'accpass' => $accountPassHelper->getPassword($account, $this->acl, AccountPasswordHelper::TYPE_NORMAL), ]; - $this->eventDispatcher->notifyEvent('copy.account.pass', new Event($this)); + $this->eventDispatcher->notifyEvent('copy.account.pass', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Clave copiada')) + ->addDetail(__u('Cuenta'), $account->getName())) + ); $this->returnJsonResponseData($data); } /** * Saves copy action - * - * @throws \SP\Core\Dic\ContainerException */ public function saveCopyAction() { @@ -564,13 +578,20 @@ class AccountController extends ControllerBase implements CrudControllerInterfac try { $form = new AccountForm(); $form->validate(ActionsInterface::ACCOUNT_CREATE); - $form->getItemData()->userId = $this->userData->getId(); - $accountId = $this->accountService->create($form->getItemData()); + $itemData = $form->getItemData(); + $itemData->userId = $this->userData->getId(); + + $accountId = $this->accountService->create($itemData); $this->addCustomFieldsForItem(ActionsInterface::ACCOUNT, $accountId); - $this->eventDispatcher->notifyEvent('create.account', new Event($this)); + $this->eventDispatcher->notifyEvent('create.account', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Cuenta creada')) + ->addDetail(__u('Cuenta'), $itemData->name)) + ); $this->returnJsonResponseData( [ @@ -585,7 +606,7 @@ class AccountController extends ControllerBase implements CrudControllerInterfac } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -603,11 +624,18 @@ class AccountController extends ControllerBase implements CrudControllerInterfac $form = new AccountForm($id); $form->validate(ActionsInterface::ACCOUNT_EDIT); - $this->accountService->update($form->getItemData()); + $itemData = $form->getItemData(); + + $this->accountService->update($itemData); $this->updateCustomFieldsForItem(ActionsInterface::ACCOUNT, $id); - $this->eventDispatcher->notifyEvent('edit.account', new Event($this)); + $this->eventDispatcher->notifyEvent('edit.account', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Cuenta actualizada')) + ->addDetail(__u('Cuenta'), $itemData->name)) + ); $this->returnJsonResponseData( [ @@ -619,10 +647,10 @@ class AccountController extends ControllerBase implements CrudControllerInterfac ); } catch (ValidationException $e) { $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -640,9 +668,16 @@ class AccountController extends ControllerBase implements CrudControllerInterfac $form = new AccountForm($id); $form->validate(ActionsInterface::ACCOUNT_EDIT_PASS); - $this->accountService->editPassword($form->getItemData()); + $itemData = $form->getItemData(); - $this->eventDispatcher->notifyEvent('edit.account.pass', new Event($this)); + $this->accountService->editPassword($itemData); + + $this->eventDispatcher->notifyEvent('edit.account.pass', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Clave actualizada')) + ->addDetail(__u('Cuenta'), $itemData->name)) + ); $this->returnJsonResponseData( [ @@ -654,10 +689,10 @@ class AccountController extends ControllerBase implements CrudControllerInterfac ); } catch (ValidationException $e) { $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -665,7 +700,7 @@ class AccountController extends ControllerBase implements CrudControllerInterfac * Saves restore action * * @param int $historyId Account's history ID - * @param int $id Account's ID + * @param int $id Account's ID * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface */ @@ -674,7 +709,12 @@ class AccountController extends ControllerBase implements CrudControllerInterfac try { $this->accountService->editRestore($historyId, $id); - $this->eventDispatcher->notifyEvent('edit.account.restore', new Event($this)); + $this->eventDispatcher->notifyEvent('edit.account.restore', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Cuenta restaurada')) + ->addDetail(__u('Cuenta'), $id)) + ); $this->returnJsonResponseData( [ @@ -684,10 +724,10 @@ class AccountController extends ControllerBase implements CrudControllerInterfac JsonResponse::JSON_SUCCESS, __u('Cuenta restaurada') ); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -695,6 +735,8 @@ class AccountController extends ControllerBase implements CrudControllerInterfac * Saves delete action * * @param int $id Account's ID + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ public function saveDeleteAction($id) { @@ -702,7 +744,12 @@ class AccountController extends ControllerBase implements CrudControllerInterfac if ($this->accountService->delete($id)) { $this->deleteCustomFieldsForItem(ActionsInterface::ACCOUNT, $id); - $this->eventDispatcher->notifyEvent('delete.account', new Event($this)); + $this->eventDispatcher->notifyEvent('delete.account', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Cuenta eliminada')) + ->addDetail(__u('Cuenta'), $id)) + ); $this->returnJsonResponseData( ['nextAction' => Acl::getActionRoute(ActionsInterface::ACCOUNT_SEARCH)], @@ -710,10 +757,10 @@ class AccountController extends ControllerBase implements CrudControllerInterfac __u('Cuenta eliminada') ); } - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -722,7 +769,7 @@ class AccountController extends ControllerBase implements CrudControllerInterfac * * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface - * @throws \SP\Services\Auth\AuthException + * @throws AuthException */ protected function initialize() { diff --git a/app/modules/web/Controllers/AccountFileController.php b/app/modules/web/Controllers/AccountFileController.php index a1880f07..9b08f41f 100644 --- a/app/modules/web/Controllers/AccountFileController.php +++ b/app/modules/web/Controllers/AccountFileController.php @@ -27,9 +27,11 @@ namespace SP\Modules\Web\Controllers; use SP\Core\Acl\Acl; use SP\Core\Acl\ActionsInterface; use SP\Core\Events\Event; +use SP\Core\Events\EventMessage; use SP\Core\Exceptions\SPException; use SP\DataModel\FileData; use SP\Html\Html; +use SP\Http\JsonResponse; use SP\Http\Request; use SP\Mgmt\Files\FileUtil; use SP\Modules\Web\Controllers\Helpers\ItemsGridHelper; @@ -74,7 +76,12 @@ class AccountFileController extends ControllerBase implements CrudControllerInte $this->view->assign('fileData', $fileData); $this->view->assign('isImage', 1); - $this->eventDispatcher->notifyEvent('show.accountFile', new Event($this)); + $this->eventDispatcher->notifyEvent('show.accountFile', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Archivo visualizado')) + ->addDetail(__u('Archivo'), $fileData->getName())) + ); $this->returnJsonResponseData(['html' => $this->render()]); } @@ -82,17 +89,22 @@ class AccountFileController extends ControllerBase implements CrudControllerInte if (mb_strtoupper($fileData->getExtension()) === 'TXT') { $this->view->assign('data', htmlentities($fileData->getContent())); - $this->eventDispatcher->notifyEvent('show.accountFile', new Event($this)); + $this->eventDispatcher->notifyEvent('show.accountFile', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Archivo visualizado')) + ->addDetail(__u('Archivo'), $fileData->getName())) + ); $this->returnJsonResponseData(['html' => $this->render()]); } } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(1, $e->getMessage()); + $this->returnJsonResponseException($e); } - $this->returnJsonResponse(1, __('Archivo no soportado para visualizar')); + $this->returnJsonResponse(JsonResponse::JSON_WARNING, __u('Archivo no soportado para visualizar')); } /** @@ -116,7 +128,11 @@ class AccountFileController extends ControllerBase implements CrudControllerInte header('Content-Description: PHP Generated Data'); header('Content-transfer-encoding: binary'); - $this->eventDispatcher->notifyEvent('download.accountFile', new Event($this)); + $this->eventDispatcher->notifyEvent('download.accountFile', + new Event($this, EventMessage::factory() + ->addDescription(__u('Archivo descargado')) + ->addDetail(__u('Archivo'), $fileData->getName())) + ); exit($fileData->getContent()); } catch (\Exception $e) { @@ -180,7 +196,12 @@ class AccountFileController extends ControllerBase implements CrudControllerInte $this->accountFileService->create($fileData); - $this->eventDispatcher->notifyEvent('upload.accountFile', new Event($this)); + $this->eventDispatcher->notifyEvent('upload.accountFile', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Archivo guardado')) + ->addDetail(__u('Archivo'), $fileData->getName())) + ); $this->returnJsonResponse(0, __u('Archivo guardado')); } catch (SPException $e) { @@ -190,7 +211,7 @@ class AccountFileController extends ControllerBase implements CrudControllerInte } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(1, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -245,13 +266,17 @@ class AccountFileController extends ControllerBase implements CrudControllerInte try { $this->accountFileService->delete($id); - $this->eventDispatcher->notifyEvent('delete.accountFile', new Event($this)); + $this->eventDispatcher->notifyEvent('delete.accountFile', + new Event($this, EventMessage::factory() + ->addDescription(__u('Archivo eliminado')) + ->addDetail(__u('Archivo'), $id)) + ); - $this->returnJsonResponse(0, __('Archivo Eliminado')); + $this->returnJsonResponse(0, __u('Archivo Eliminado')); } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(1, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -314,6 +339,7 @@ class AccountFileController extends ControllerBase implements CrudControllerInte * * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface + * @throws \SP\Services\Auth\AuthException */ protected function initialize() { diff --git a/app/modules/web/Controllers/ApiTokenController.php b/app/modules/web/Controllers/ApiTokenController.php index 349be057..73fafab6 100644 --- a/app/modules/web/Controllers/ApiTokenController.php +++ b/app/modules/web/Controllers/ApiTokenController.php @@ -24,12 +24,10 @@ namespace SP\Modules\Web\Controllers; -use Defuse\Crypto\Exception\CryptoException; -use Defuse\Crypto\Exception\EnvironmentIsBrokenException; use SP\Core\Acl\Acl; use SP\Core\Acl\ActionsInterface; use SP\Core\Events\Event; -use SP\Core\Exceptions\SPException; +use SP\Core\Events\EventMessage; use SP\Core\Exceptions\ValidationException; use SP\DataModel\AuthTokenData; use SP\Forms\AuthTokenForm; @@ -105,7 +103,7 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(1, $e->getMessage()); + $this->returnJsonResponseException($e); } $this->returnJsonResponseData(['html' => $this->render()]); @@ -165,7 +163,7 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } $this->returnJsonResponseData(['html' => $this->render()]); @@ -187,13 +185,18 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa $this->deleteCustomFieldsForItem(ActionsInterface::APITOKEN, $id); - $this->eventDispatcher->notifyEvent('delete.authToken', new Event($this)); + $this->eventDispatcher->notifyEvent('delete.authToken', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Autorización eliminada')) + ->addDetail(__u('Autorización'), $id)) + ); $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Autorización eliminada')); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -223,18 +226,10 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Autorización creada')); } catch (ValidationException $e) { $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); - } catch (EnvironmentIsBrokenException $e) { - processException($e); - - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); - } catch (CryptoException $e) { - processException($e); - - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -242,6 +237,8 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa * Saves edit action * * @param $id + * @throws \Psr\Container\ContainerExceptionInterface + * @throws \Psr\Container\NotFoundExceptionInterface * @throws \SP\Core\Dic\ContainerException */ public function saveEditAction($id) @@ -254,14 +251,24 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa $form = new AuthTokenForm($id); $form->validate(ActionsInterface::APITOKEN_EDIT); - if ($form->isRefresh()){ + if ($form->isRefresh()) { $this->authTokenService->refreshAndUpdate($form->getItemData()); - $this->eventDispatcher->notifyEvent('refresh.authToken', new Event($this)); + $this->eventDispatcher->notifyEvent('refresh.authToken', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Autorización actualizada')) + ->addDetail(__u('Autorización'), $id)) + ); } else { $this->authTokenService->update($form->getItemData()); - $this->eventDispatcher->notifyEvent('edit.authToken', new Event($this)); + $this->eventDispatcher->notifyEvent('edit.authToken', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Autorización actualizada')) + ->addDetail(__u('Autorización'), $id)) + ); } $this->updateCustomFieldsForItem(ActionsInterface::APITOKEN, $id); @@ -269,14 +276,10 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Autorización actualizada')); } catch (ValidationException $e) { $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); - } catch (CryptoException $e) { - processException($e); - - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -298,11 +301,16 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa try { $this->setViewData($id); - $this->eventDispatcher->notifyEvent('show.authToken', new Event($this)); + $this->eventDispatcher->notifyEvent('show.authToken', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Autorización visualizada')) + ->addDetail(__u('Autorización'), $id)) + ); } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } $this->returnJsonResponseData(['html' => $this->render()]); @@ -313,6 +321,7 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa * * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface + * @throws \SP\Services\Auth\AuthException */ protected function initialize() { diff --git a/app/modules/web/Controllers/CategoryController.php b/app/modules/web/Controllers/CategoryController.php index 7d26d0f6..b455055f 100644 --- a/app/modules/web/Controllers/CategoryController.php +++ b/app/modules/web/Controllers/CategoryController.php @@ -27,7 +27,7 @@ namespace SP\Modules\Web\Controllers; use SP\Core\Acl\Acl; use SP\Core\Acl\ActionsInterface; use SP\Core\Events\Event; -use SP\Core\Exceptions\SPException; +use SP\Core\Events\EventMessage; use SP\Core\Exceptions\ValidationException; use SP\DataModel\CategoryData; use SP\Forms\CategoryForm; @@ -100,7 +100,7 @@ class CategoryController extends ControllerBase implements CrudControllerInterfa } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(1, $e->getMessage()); + $this->returnJsonResponseException($e); } $this->returnJsonResponseData(['html' => $this->render()]); @@ -157,7 +157,7 @@ class CategoryController extends ControllerBase implements CrudControllerInterfa } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } $this->returnJsonResponseData(['html' => $this->render()]); @@ -180,20 +180,26 @@ class CategoryController extends ControllerBase implements CrudControllerInterfa $this->deleteCustomFieldsForItem(ActionsInterface::CATEGORY, $id); - $this->eventDispatcher->notifyEvent('delete.category', new Event($this)); + $this->eventDispatcher->notifyEvent('delete.category', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Categoría eliminada')) + ->addDetail(__u('Categoría'), $id)) + ); $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Categoría eliminada')); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } /** * Saves create action * - * @throws \SP\Core\Dic\ContainerException + * @throws \Psr\Container\ContainerExceptionInterface + * @throws \Psr\Container\NotFoundExceptionInterface */ public function saveCreateAction() { @@ -205,19 +211,26 @@ class CategoryController extends ControllerBase implements CrudControllerInterfa $form = new CategoryForm(); $form->validate(ActionsInterface::CATEGORY_CREATE); - $id = $this->categoryService->create($form->getItemData()); + $itemData = $form->getItemData(); + + $id = $this->categoryService->create($itemData); $this->addCustomFieldsForItem(ActionsInterface::CATEGORY, $id); - $this->eventDispatcher->notifyEvent('create.category', new Event($this)); + $this->eventDispatcher->notifyEvent('create.category', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Categoría creada')) + ->addDetail(__u('Categoría'), $itemData->getName())) + ); $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Categoría creada')); } catch (ValidationException $e) { $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -225,6 +238,8 @@ class CategoryController extends ControllerBase implements CrudControllerInterfa * Saves edit action * * @param $id + * @throws \Psr\Container\ContainerExceptionInterface + * @throws \Psr\Container\NotFoundExceptionInterface * @throws \SP\Core\Dic\ContainerException */ public function saveEditAction($id) @@ -237,19 +252,26 @@ class CategoryController extends ControllerBase implements CrudControllerInterfa $form = new CategoryForm($id); $form->validate(ActionsInterface::CATEGORY_EDIT); - $this->categoryService->update($form->getItemData()); + $itemData = $form->getItemData(); + + $this->categoryService->update($itemData); $this->updateCustomFieldsForItem(ActionsInterface::CATEGORY, $id); - $this->eventDispatcher->notifyEvent('edit.category', new Event($this)); + $this->eventDispatcher->notifyEvent('edit.category', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Categoría actualizada')) + ->addDetail(__u('Categoría'), $itemData->getName())) + ); $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Categoría actualizada')); } catch (ValidationException $e) { $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -275,7 +297,7 @@ class CategoryController extends ControllerBase implements CrudControllerInterfa } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } $this->returnJsonResponseData(['html' => $this->render()]); @@ -286,6 +308,7 @@ class CategoryController extends ControllerBase implements CrudControllerInterfa * * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface + * @throws \SP\Services\Auth\AuthException */ protected function initialize() { diff --git a/app/modules/web/Controllers/ClientController.php b/app/modules/web/Controllers/ClientController.php index 341c3092..60deb31d 100644 --- a/app/modules/web/Controllers/ClientController.php +++ b/app/modules/web/Controllers/ClientController.php @@ -28,7 +28,7 @@ namespace SP\Modules\Web\Controllers; use SP\Core\Acl\Acl; use SP\Core\Acl\ActionsInterface; use SP\Core\Events\Event; -use SP\Core\Exceptions\SPException; +use SP\Core\Events\EventMessage; use SP\Core\Exceptions\ValidationException; use SP\DataModel\ClientData; use SP\Forms\ClientForm; @@ -101,7 +101,7 @@ class ClientController extends ControllerBase implements CrudControllerInterface } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(1, $e->getMessage()); + $this->returnJsonResponseException($e); } $this->returnJsonResponseData(['html' => $this->render()]); @@ -158,7 +158,7 @@ class ClientController extends ControllerBase implements CrudControllerInterface } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } $this->returnJsonResponseData(['html' => $this->render()]); @@ -168,6 +168,8 @@ class ClientController extends ControllerBase implements CrudControllerInterface * Delete action * * @param $id + * @throws \Psr\Container\ContainerExceptionInterface + * @throws \Psr\Container\NotFoundExceptionInterface */ public function deleteAction($id) { @@ -180,13 +182,18 @@ class ClientController extends ControllerBase implements CrudControllerInterface $this->deleteCustomFieldsForItem(ActionsInterface::CLIENT, $id); - $this->eventDispatcher->notifyEvent('delete.client', new Event($this)); + $this->eventDispatcher->notifyEvent('delete.client', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Cliente eliminado')) + ->addDetail(__u('Cliente'), $id)) + ); $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Cliente eliminado')); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -205,17 +212,24 @@ class ClientController extends ControllerBase implements CrudControllerInterface $form = new ClientForm(); $form->validate(ActionsInterface::CLIENT_CREATE); - $this->clientService->create($form->getItemData()); + $itemData = $form->getItemData(); - $this->eventDispatcher->notifyEvent('create.client', new Event($this)); + $this->clientService->create($itemData); + + $this->eventDispatcher->notifyEvent('create.client', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Cliente creado')) + ->addDetail(__u('Cliente'), $itemData->getName())) + ); $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Cliente creado')); } catch (ValidationException $e) { $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -237,15 +251,20 @@ class ClientController extends ControllerBase implements CrudControllerInterface $this->clientService->update($form->getItemData()); - $this->eventDispatcher->notifyEvent('edit.client', new Event($this)); + $this->eventDispatcher->notifyEvent('edit.client', + new Event($this, + EventMessage::factory() + ->addDescription(__u('Cliente actualizado')) + ->addDetail(__u('Cliente'), $id)) + ); $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Cliente actualizado')); } catch (ValidationException $e) { $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); - } catch (SPException $e) { + } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } } @@ -271,7 +290,7 @@ class ClientController extends ControllerBase implements CrudControllerInterface } catch (\Exception $e) { processException($e); - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage()); + $this->returnJsonResponseException($e); } $this->returnJsonResponseData(['html' => $this->render()]); @@ -282,6 +301,7 @@ class ClientController extends ControllerBase implements CrudControllerInterface * * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface + * @throws \SP\Services\Auth\AuthException */ protected function initialize() { diff --git a/app/modules/web/Controllers/ConfigAccountController.php b/app/modules/web/Controllers/ConfigAccountController.php index cad36e40..257aebba 100644 --- a/app/modules/web/Controllers/ConfigAccountController.php +++ b/app/modules/web/Controllers/ConfigAccountController.php @@ -42,7 +42,6 @@ class ConfigAccountController extends SimpleControllerBase use ConfigTrait; /** - * @throws \SP\Core\Exceptions\InvalidArgumentException */ public function saveAction() { diff --git a/app/modules/web/Controllers/ConfigBackupController.php b/app/modules/web/Controllers/ConfigBackupController.php index f52f3076..f975ec9d 100644 --- a/app/modules/web/Controllers/ConfigBackupController.php +++ b/app/modules/web/Controllers/ConfigBackupController.php @@ -26,6 +26,8 @@ namespace SP\Modules\Web\Controllers; use SP\Core\Acl\ActionsInterface; use SP\Core\Acl\UnauthorizedPageException; +use SP\Core\Events\Event; +use SP\Core\Events\EventMessage; use SP\Core\Exceptions\SPException; use SP\Http\JsonResponse; use SP\Http\Request; @@ -56,8 +58,17 @@ class ConfigBackupController extends SimpleControllerBase $backupService = new FileBackupService(); $backupService->doBackup(); + $this->eventDispatcher->notifyEvent('run.backup.end', + new Event($this, EventMessage::factory() + ->addDescription(__u('Copia de la aplicación y base de datos realizada correctamente'))) + ); + $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Proceso de backup finalizado')); } catch (\Exception $e) { + processException($e); + + $this->eventDispatcher->notifyEvent('exception', new Event($e)); + $this->returnJsonResponseException($e); } } @@ -76,11 +87,25 @@ class ConfigBackupController extends SimpleControllerBase } try { + $this->eventDispatcher->notifyEvent('run.export.start', + new Event($this, EventMessage::factory() + ->addDescription(__u('Exportación de sysPass en XML'))) + ); + $exportService = $this->dic->get(XmlExportService::class); $exportService->doExport($exportPassword); + $this->eventDispatcher->notifyEvent('run.export.end', + new Event($this, EventMessage::factory() + ->addDescription(__u('Proceso de exportación finalizado'))) + ); + $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Proceso de exportación finalizado')); } catch (\Exception $e) { + processException($e); + + $this->eventDispatcher->notifyEvent('exception', new Event($e)); + $this->returnJsonResponseException($e); } } @@ -92,7 +117,7 @@ class ConfigBackupController extends SimpleControllerBase throw new UnauthorizedPageException(SPException::INFO); } } catch (UnauthorizedPageException $e) { - $this->returnJsonResponse(JsonResponse::JSON_ERROR, $e->getMessage(), [$e->getHint()]); + $this->returnJsonResponseException($e); } } } \ No newline at end of file diff --git a/app/modules/web/Controllers/ConfigImportController.php b/app/modules/web/Controllers/ConfigImportController.php index c6a6758e..ec438941 100644 --- a/app/modules/web/Controllers/ConfigImportController.php +++ b/app/modules/web/Controllers/ConfigImportController.php @@ -67,7 +67,7 @@ class ConfigImportController extends SimpleControllerBase $this->eventDispatcher->notifyEvent('run.import', new Event($this, EventMessage::factory() - ->addDetail(__('Cuentas importadas'), $counter)) + ->addDetail(__u('Cuentas importadas'), $counter)) ); if ($counter > 0) { diff --git a/app/modules/web/Controllers/ConfigManagerController.php b/app/modules/web/Controllers/ConfigManagerController.php index 07d0d62a..6b14d03d 100644 --- a/app/modules/web/Controllers/ConfigManagerController.php +++ b/app/modules/web/Controllers/ConfigManagerController.php @@ -62,7 +62,6 @@ class ConfigManagerController extends ControllerBase /** * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface - * @throws \SP\Core\Exceptions\InvalidArgumentException * @throws \SP\Services\Config\ParameterNotFoundException * @throws \SP\Core\Exceptions\SPException */ @@ -76,7 +75,6 @@ class ConfigManagerController extends ControllerBase * * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface - * @throws \SP\Core\Exceptions\InvalidArgumentException * @throws \SP\Services\Config\ParameterNotFoundException * @throws \SP\Core\Exceptions\SPException */ diff --git a/lib/SP/Services/Backup/FileBackupService.php b/lib/SP/Services/Backup/FileBackupService.php index e7960864..dfc1a471 100644 --- a/lib/SP/Services/Backup/FileBackupService.php +++ b/lib/SP/Services/Backup/FileBackupService.php @@ -29,12 +29,14 @@ use Psr\Container\NotFoundExceptionInterface; use SP\Bootstrap; use SP\Config\ConfigData; use SP\Core\Events\Event; +use SP\Core\Events\EventMessage; use SP\Core\Exceptions\SPException; use SP\Services\Service; use SP\Services\ServiceException; use SP\Storage\Database; use SP\Storage\DBUtil; use SP\Storage\DbWrapper; +use SP\Storage\FileHandler; use SP\Storage\QueryData; use SP\Util\Checks; use SP\Util\Util; @@ -54,7 +56,6 @@ class FileBackupService extends Service /** * Realizar backup de la BBDD y aplicación. * - * @return bool * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface * @throws ServiceException @@ -72,21 +73,26 @@ class FileBackupService extends Service $bakFileDB = BACKUP_PATH . DIRECTORY_SEPARATOR . $siteName . '_db-' . $backupUniqueHash . '.sql'; try { - $this->eventDispatcher->notifyEvent('run.backup.start', new Event($this, [__u('Realizar Backup')])); - $this->checkBackupDir(); $this->deleteOldBackups(); - $this->backupTables('*', $bakFileDB); - $this->backupApp($bakFileApp); - $this->eventDispatcher->notifyEvent('run.backup.end', new Event($this, [__u('Copia de la aplicación y base de datos realizada correctamente')])); + $this->eventDispatcher->notifyEvent('run.backup.start', + new Event($this, + EventMessage::factory()->addDescription(__u('Realizar Backup')))); + + $this->backupTables('*', new FileHandler($bakFileDB)); + $this->backupApp($bakFileApp); } catch (ServiceException $e) { throw $e; } catch (\Exception $e) { - throw new ServiceException(__u('Error al realizar el backup'), SPException::ERROR, __u('Revise el registro de eventos para más detalles')); + throw new ServiceException( + __u('Error al realizar el backup'), + SPException::ERROR, + __u('Revise el registro de eventos para más detalles'), + $e->getCode(), + $e + ); } - - return true; } /** @@ -99,12 +105,12 @@ class FileBackupService extends Service { if (@mkdir(BACKUP_PATH, 0750) === false && is_dir(BACKUP_PATH) === false) { throw new ServiceException( - sprintf(__('No es posible crear el directorio de backups ("%s")'), BACKUP_PATH), SPException::ERROR); + sprintf(__('No es posible crear el directorio de backups ("%s")'), BACKUP_PATH)); } if (!is_writable(BACKUP_PATH)) { throw new ServiceException( - __u('Compruebe los permisos del directorio de backups'), SPException::ERROR); + __u('Compruebe los permisos del directorio de backups')); } return true; @@ -124,118 +130,122 @@ class FileBackupService extends Service * Utilizar '*' para toda la BBDD o 'table1 table2 table3...' * * @param string|array $tables - * @param string $backupFile - * @throws ServiceException - * @throws \Psr\Container\ContainerExceptionInterface - * @throws \Psr\Container\NotFoundExceptionInterface + * @param FileHandler $fileHandler + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + * @throws SPException + * @throws \SP\Core\Dic\ContainerException + * @throws \SP\Storage\FileException */ - private function backupTables($tables = '*', $backupFile) + private function backupTables($tables = '*', FileHandler $fileHandler) { + $this->eventDispatcher->notifyEvent('run.backup.process', + new Event($this, + EventMessage::factory()->addDescription(__u('Copiando base de datos'))) + ); + + $fileHandler->open('w'); + $db = $this->dic->get(Database::class); + $queryData = new QueryData(); + + if ($tables === '*') { + $resTables = DBUtil::$tables; + } else { + $resTables = is_array($tables) ? $tables : explode(',', $tables); + } + + $lineSeparator = PHP_EOL . PHP_EOL; + $dbname = $this->configData->getDbName(); - try { - $handle = fopen($backupFile, 'w'); + $sqlOut = '--' . PHP_EOL; + $sqlOut .= '-- sysPass DB dump generated on ' . time() . ' (START)' . PHP_EOL; + $sqlOut .= '--' . PHP_EOL; + $sqlOut .= '-- Please, do not alter this file, it could break your DB' . PHP_EOL; + $sqlOut .= '--' . PHP_EOL . PHP_EOL; + $sqlOut .= 'CREATE DATABASE IF NOT EXISTS `' . $dbname . '`;' . PHP_EOL . PHP_EOL; + $sqlOut .= 'USE `' . $dbname . '`;' . PHP_EOL . PHP_EOL; - $Data = new QueryData(); + $fileHandler->write($sqlOut); - if ($tables === '*') { - $resTables = DBUtil::$tables; - } else { - $resTables = is_array($tables) ? $tables : explode(',', $tables); + $sqlOutViews = ''; + // Recorrer las tablas y almacenar los datos + foreach ($resTables as $table) { + $tableName = is_object($table) ? $table->{'Tables_in_' . $dbname} : $table; + + $queryData->setQuery('SHOW CREATE TABLE ' . $tableName); + + // Consulta para crear la tabla + $txtCreate = DbWrapper::getResults($queryData, $db); + + if (isset($txtCreate->{'Create Table'})) { + $sqlOut = '-- ' . PHP_EOL; + $sqlOut .= '-- Table ' . strtoupper($tableName) . PHP_EOL; + $sqlOut .= '-- ' . PHP_EOL; + $sqlOut .= 'DROP TABLE IF EXISTS `' . $tableName . '`;' . PHP_EOL . PHP_EOL; + $sqlOut .= $txtCreate->{'Create Table'} . ';' . PHP_EOL . PHP_EOL; + + $fileHandler->write($sqlOut); + } elseif ($txtCreate->{'Create View'}) { + $sqlOutViews .= '-- ' . PHP_EOL; + $sqlOutViews .= '-- View ' . strtoupper($tableName) . PHP_EOL; + $sqlOutViews .= '-- ' . PHP_EOL; + $sqlOutViews .= 'DROP TABLE IF EXISTS `' . $tableName . '`;' . PHP_EOL . PHP_EOL; + $sqlOutViews .= $txtCreate->{'Create View'} . ';' . PHP_EOL . PHP_EOL; } - $sqlOut = '--' . PHP_EOL; - $sqlOut .= '-- sysPass DB dump generated on ' . time() . ' (START)' . PHP_EOL; - $sqlOut .= '--' . PHP_EOL; - $sqlOut .= '-- Please, do not alter this file, it could break your DB' . PHP_EOL; - $sqlOut .= '--' . PHP_EOL . PHP_EOL; - $sqlOut .= 'CREATE DATABASE IF NOT EXISTS `' . $dbname . '`;' . PHP_EOL . PHP_EOL; - $sqlOut .= 'USE `' . $dbname . '`;' . PHP_EOL . PHP_EOL; - fwrite($handle, $sqlOut); + $fileHandler->write($lineSeparator); + } - $sqlOutViews = ''; - // Recorrer las tablas y almacenar los datos - foreach ($resTables as $table) { - $tableName = is_object($table) ? $table->{'Tables_in_' . $dbname} : $table; + // Guardar las vistas + $fileHandler->write($sqlOutViews); - $Data->setQuery('SHOW CREATE TABLE ' . $tableName); - - // Consulta para crear la tabla - $txtCreate = DbWrapper::getResults($Data, $db); - - if (isset($txtCreate->{'Create Table'})) { - $sqlOut = '-- ' . PHP_EOL; - $sqlOut .= '-- Table ' . strtoupper($tableName) . PHP_EOL; - $sqlOut .= '-- ' . PHP_EOL; - $sqlOut .= 'DROP TABLE IF EXISTS `' . $tableName . '`;' . PHP_EOL . PHP_EOL; - $sqlOut .= $txtCreate->{'Create Table'} . ';' . PHP_EOL . PHP_EOL; - fwrite($handle, $sqlOut); - } elseif ($txtCreate->{'Create View'}) { - $sqlOutViews .= '-- ' . PHP_EOL; - $sqlOutViews .= '-- View ' . strtoupper($tableName) . PHP_EOL; - $sqlOutViews .= '-- ' . PHP_EOL; - $sqlOutViews .= 'DROP TABLE IF EXISTS `' . $tableName . '`;' . PHP_EOL . PHP_EOL; - $sqlOutViews .= $txtCreate->{'Create View'} . ';' . PHP_EOL . PHP_EOL; - } - - fwrite($handle, PHP_EOL . PHP_EOL); + // Guardar los datos + foreach ($resTables as $tableName) { + // No guardar las vistas! + if (strrpos($tableName, '_v') !== false) { + continue; } - // Guardar las vistas - fwrite($handle, $sqlOutViews); + $queryData->setQuery('SELECT * FROM `' . $tableName . '`'); - // Guardar los datos - foreach ($resTables as $tableName) { - // No guardar las vistas! - if (strrpos($tableName, '_v') !== false) { - continue; - } + // Consulta para obtener los registros de la tabla + $queryRes = DbWrapper::getResultsRaw($queryData, $db); - $Data->setQuery('SELECT * FROM `' . $tableName . '`'); + $numColumns = $queryRes->columnCount(); - // Consulta para obtener los registros de la tabla - $queryRes = DbWrapper::getResultsRaw($Data); + while ($row = $queryRes->fetch(\PDO::FETCH_NUM)) { + $fileHandler->write('INSERT INTO `' . $tableName . '` VALUES('); - $numColumns = $queryRes->columnCount(); - - while ($row = $queryRes->fetch(\PDO::FETCH_NUM)) { - fwrite($handle, 'INSERT INTO `' . $tableName . '` VALUES('); - - $field = 1; - foreach ($row as $value) { - if (is_numeric($value)) { - fwrite($handle, $value); - } else { - fwrite($handle, DBUtil::escape($value, $db->getDbHandler())); - } - - if ($field < $numColumns) { - fwrite($handle, ','); - } - - $field++; + $field = 1; + foreach ($row as $value) { + if (is_numeric($value)) { + $fileHandler->write($value); + } else { + $fileHandler->write(DBUtil::escape($value, $db->getDbHandler())); } - fwrite($handle, ');' . PHP_EOL); + if ($field < $numColumns) { + $fileHandler->write(','); + } + + $field++; } + + $fileHandler->write(');' . PHP_EOL); } - - $sqlOut = '--' . PHP_EOL; - $sqlOut .= '-- sysPass DB dump generated on ' . time() . ' (END)' . PHP_EOL; - $sqlOut .= '--' . PHP_EOL; - $sqlOut .= '-- Please, do not alter this file, it could break your DB' . PHP_EOL; - $sqlOut .= '--' . PHP_EOL . PHP_EOL; - - fwrite($handle, $sqlOut); - - fclose($handle); - } catch (\Exception $e) { - processException($e); - - throw new ServiceException($e->getMessage(), SPException::CRITICAL); } + + $sqlOut = '--' . PHP_EOL; + $sqlOut .= '-- sysPass DB dump generated on ' . time() . ' (END)' . PHP_EOL; + $sqlOut .= '--' . PHP_EOL; + $sqlOut .= '-- Please, do not alter this file, it could break your DB' . PHP_EOL; + $sqlOut .= '--' . PHP_EOL . PHP_EOL; + + $fileHandler->write($sqlOut); + $fileHandler->close(); } /** @@ -247,37 +257,36 @@ class FileBackupService extends Service */ private function backupApp($backupFile) { + $this->eventDispatcher->notifyEvent('run.backup.process', + new Event($this, + EventMessage::factory()->addDescription(__u('Copiando aplicación'))) + ); + if (!class_exists(\PharData::class)) { if (Checks::checkIsWindows()) { throw new ServiceException( - __u('Esta operación sólo es posible en entornos Linux'), SPException::INFO); + __u('Esta operación sólo es posible en entornos Linux'), ServiceException::INFO); } if (!$this->backupAppLegacyLinux($backupFile)) { throw new ServiceException( - __u('Error al realizar backup en modo compatibilidad'), SPException::ERROR); + __u('Error al realizar backup en modo compatibilidad')); } } $compressedFile = $backupFile . '.gz'; - try { - if (file_exists($compressedFile)) { - unlink($compressedFile); - } - - $archive = new \PharData($backupFile); - $archive->buildFromDirectory(Bootstrap::$SERVERROOT, '/^(?!backup).*$/'); - $archive->compress(\Phar::GZ); - - unlink($backupFile); - - return file_exists($backupFile); - } catch (\Exception $e) { - processException($e); - - throw new ServiceException($e->getMessage(), SPException::CRITICAL); + if (file_exists($compressedFile)) { + unlink($compressedFile); } + + $archive = new \PharData($backupFile); + $archive->buildFromDirectory(Bootstrap::$SERVERROOT, '/^(?!backup).*$/'); + $archive->compress(\Phar::GZ); + + unlink($backupFile); + + return file_exists($backupFile); } /** diff --git a/lib/SP/Services/Export/XmlExportService.php b/lib/SP/Services/Export/XmlExportService.php index 1889a92f..42ae07d0 100644 --- a/lib/SP/Services/Export/XmlExportService.php +++ b/lib/SP/Services/Export/XmlExportService.php @@ -30,7 +30,7 @@ use SP\Config\ConfigData; use SP\Core\Crypt\Crypt; use SP\Core\Crypt\Hash; use SP\Core\Events\Event; -use SP\Core\Exceptions\SPException; +use SP\Core\Events\EventMessage; use SP\DataModel\CategoryData; use SP\Services\Account\AccountService; use SP\Services\Account\AccountToTagService; @@ -157,8 +157,6 @@ class XmlExportService extends Service public function makeXML() { try { - $this->eventDispatcher->notifyEvent('export.xml.start', new Event($this, [__u('Exportar XML')])); - $this->checkExportDir(); $this->createRoot(); $this->createMeta(); @@ -168,14 +166,16 @@ class XmlExportService extends Service $this->createAccounts(); $this->createHash(); $this->writeXML(); - - $this->eventDispatcher->notifyEvent('export.xml.end', new Event($this, [__u('Exportación realizada correctamente')])); } catch (ServiceException $e) { throw $e; } catch (\Exception $e) { - processException($e); - - throw new ServiceException(__u('Error al realizar la exportación'), SPException::ERROR, __u('Revise el registro de eventos para más detalles')); + throw new ServiceException( + __u('Error al realizar la exportación'), + ServiceException::ERROR, + __u('Revise el registro de eventos para más detalles'), + $e->getCode(), + $e + ); } } @@ -188,13 +188,13 @@ class XmlExportService extends Service private function checkExportDir() { if (@mkdir($this->exportDir, 0750) === false && is_dir($this->exportDir) === false) { - throw new ServiceException(sprintf(__('No es posible crear el directorio de backups ("%s")'), $this->exportDir), SPException::ERROR); + throw new ServiceException(sprintf(__('No es posible crear el directorio de backups ("%s")'), $this->exportDir)); } clearstatcache(true, $this->exportDir); if (!is_writable($this->exportDir)) { - throw new ServiceException(__u('Compruebe los permisos del directorio de backups'), SPException::ERROR); + throw new ServiceException(__u('Compruebe los permisos del directorio de backups')); } return true; @@ -211,7 +211,7 @@ class XmlExportService extends Service $root = $this->xml->createElement('Root'); $this->root = $this->xml->appendChild($root); } catch (\Exception $e) { - throw new ServiceException($e->getMessage(), SPException::WARNING, __FUNCTION__); + throw new ServiceException($e->getMessage(), ServiceException::ERROR, __FUNCTION__); } } @@ -243,7 +243,7 @@ class XmlExportService extends Service $this->root->appendChild($nodeMeta); } catch (\Exception $e) { - throw new ServiceException($e->getMessage(), SPException::WARNING, __FUNCTION__); + throw new ServiceException($e->getMessage(), ServiceException::ERROR, __FUNCTION__); } } @@ -257,6 +257,11 @@ class XmlExportService extends Service private function createCategories() { try { + $this->eventDispatcher->notifyEvent('run.export.process', + new Event($this, EventMessage::factory() + ->addDescription(__u('Exportando categorías'))) + ); + $categoryService = $this->dic->get(CategoryService::class); $categories = $categoryService->getAllBasic(); @@ -286,24 +291,10 @@ class XmlExportService extends Service $this->appendNode($nodeCategories); } catch (\Exception $e) { - throw new ServiceException($e->getMessage(), SPException::WARNING, __FUNCTION__); + throw new ServiceException($e->getMessage(), ServiceException::ERROR, __FUNCTION__); } } - /** - * Escapar carácteres no válidos en XML - * - * @param $data string Los datos a escapar - * @return mixed - */ - private function escapeChars($data) - { - $arrStrFrom = ['&', '<', '>', '"', '\'']; - $arrStrTo = ['&', '<', '>', '"', ''']; - - return str_replace($arrStrFrom, $arrStrTo, $data); - } - /** * Añadir un nuevo nodo al árbol raíz * @@ -347,10 +338,24 @@ class XmlExportService extends Service $this->root->appendChild($node); } } catch (\Exception $e) { - throw new ServiceException($e->getMessage(), SPException::WARNING, __FUNCTION__); + throw new ServiceException($e->getMessage(), ServiceException::ERROR, __FUNCTION__); } } + /** + * Escapar carácteres no válidos en XML + * + * @param $data string Los datos a escapar + * @return mixed + */ + private function escapeChars($data) + { + $arrStrFrom = ['&', '<', '>', '"', '\'']; + $arrStrTo = ['&', '<', '>', '"', ''']; + + return str_replace($arrStrFrom, $arrStrTo, $data); + } + /** * Crear el nodo con los datos de los clientes * @@ -362,6 +367,11 @@ class XmlExportService extends Service private function createClients() { try { + $this->eventDispatcher->notifyEvent('run.export.process', + new Event($this, EventMessage::factory() + ->addDescription(__u('Exportando clientes'))) + ); + $clientService = $this->dic->get(ClientService::class); $clients = $clientService->getAllBasic(); @@ -389,7 +399,7 @@ class XmlExportService extends Service $this->appendNode($nodeClients); } catch (\Exception $e) { - throw new ServiceException($e->getMessage(), SPException::WARNING, __FUNCTION__); + throw new ServiceException($e->getMessage(), ServiceException::ERROR, __FUNCTION__); } } @@ -403,6 +413,11 @@ class XmlExportService extends Service private function createTags() { try { + $this->eventDispatcher->notifyEvent('run.export.process', + new Event($this, EventMessage::factory() + ->addDescription(__u('Exportando etiquetas'))) + ); + $tagService = $this->dic->get(TagService::class); $tags = $tagService->getAllBasic(); @@ -428,7 +443,7 @@ class XmlExportService extends Service $this->appendNode($nodeTags); } catch (\Exception $e) { - throw new ServiceException($e->getMessage(), SPException::WARNING, __FUNCTION__); + throw new ServiceException($e->getMessage(), ServiceException::ERROR, __FUNCTION__); } } @@ -442,6 +457,11 @@ class XmlExportService extends Service private function createAccounts() { try { + $this->eventDispatcher->notifyEvent('run.export.process', + new Event($this, EventMessage::factory() + ->addDescription(__u('Exportando cuentas'))) + ); + $accountService = $this->dic->get(AccountService::class); $accountToTagService = $this->dic->get(AccountToTagService::class); $accounts = $accountService->getAllBasic(); @@ -491,7 +511,7 @@ class XmlExportService extends Service $this->appendNode($nodeAccounts); } catch (\Exception $e) { - throw new ServiceException($e->getMessage(), SPException::WARNING, __FUNCTION__); + throw new ServiceException($e->getMessage(), ServiceException::ERROR, __FUNCTION__); } } @@ -514,7 +534,7 @@ class XmlExportService extends Service $nodeMeta = $this->root->getElementsByTagName('Meta')->item(0); $nodeMeta->appendChild($metaHash); } catch (\Exception $e) { - throw new ServiceException($e->getMessage(), SPException::WARNING, __FUNCTION__); + throw new ServiceException($e->getMessage(), ServiceException::ERROR, __FUNCTION__); } } @@ -531,7 +551,7 @@ class XmlExportService extends Service $nodeXML = $this->xml->saveXML($this->root->getElementsByTagName($node)->item(0)); return $nodeXML; } catch (\Exception $e) { - throw new ServiceException($e->getMessage(), SPException::WARNING, __FUNCTION__); + throw new ServiceException($e->getMessage(), ServiceException::ERROR, __FUNCTION__); } } @@ -547,10 +567,10 @@ class XmlExportService extends Service $this->xml->preserveWhiteSpace = false; if (!$this->xml->save($this->exportFile)) { - throw new ServiceException(__u('Error al crear el archivo XML'), SPException::ERROR); + throw new ServiceException(__u('Error al crear el archivo XML')); } } catch (\Exception $e) { - throw new ServiceException($e->getMessage(), SPException::ERROR, __FUNCTION__); + throw new ServiceException($e->getMessage(), ServiceException::ERROR, __FUNCTION__); } } diff --git a/lib/SP/Storage/FileException.php b/lib/SP/Storage/FileException.php new file mode 100644 index 00000000..0aab7edc --- /dev/null +++ b/lib/SP/Storage/FileException.php @@ -0,0 +1,14 @@ +file = $file; + } + + /** + * @param $data + * @return FileHandler + * @throws FileException + */ + public function write($data) + { + if ($this->handle === null) { + $this->open('w'); + } + + if (fwrite($this->handle, $data) === false) { + throw new FileException(sprintf(__u('No es posible escribir en el archivo (%s)'), $this->file)); + } + + return $this; + } + + /** + * @param $mode + * @return resource + * @throws FileException + */ + public function open($mode) + { + if (($this->handle = fopen($this->file, $mode)) === false) { + throw new FileException(sprintf(__u('No es posible abrir el archivo (%s)'), $this->file)); + } + + return $this->handle; + } + + /** + * @throws FileException + */ + public function close() + { + if (fclose($this->handle) === false) { + throw new FileException(sprintf(__u('No es posible cerrar el archivo (%s)'), $this->file)); + } + + return $this; + } +} \ No newline at end of file