From a12ee989f6415ca868aee92bf43515c3df5c208c Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Sat, 19 Mar 2022 10:56:20 +0200 Subject: [PATCH] type fixes --- application/Espo/Controllers/Admin.php | 2 +- application/Espo/Controllers/App.php | 16 ++-- application/Espo/Controllers/Email.php | 21 ++--- .../Espo/Controllers/EntityManager.php | 77 ++++++++++++++++++- application/Espo/Controllers/Export.php | 6 +- .../Espo/Controllers/ExternalAccount.php | 6 +- application/Espo/Controllers/LastViewed.php | 4 +- application/Espo/Controllers/MassAction.php | 6 +- application/Espo/Controllers/Metadata.php | 1 + application/Espo/Controllers/User.php | 1 + application/Espo/Services/LastViewed.php | 17 ++-- 11 files changed, 124 insertions(+), 33 deletions(-) diff --git a/application/Espo/Controllers/Admin.php b/application/Espo/Controllers/Admin.php index e06c3024d1..5a2b659bbe 100644 --- a/application/Espo/Controllers/Admin.php +++ b/application/Espo/Controllers/Admin.php @@ -174,7 +174,7 @@ class Admin * @return array{ * php: array>, * database: array>, - * permission: array, + * permission: array>, * } */ public function actionSystemRequirementList(): array diff --git a/application/Espo/Controllers/App.php b/application/Espo/Controllers/App.php index 8795b32371..e9035551bf 100644 --- a/application/Espo/Controllers/App.php +++ b/application/Espo/Controllers/App.php @@ -36,19 +36,18 @@ use Espo\Core\Di; use Espo\Core\Api\Request; use Espo\Core\Api\Response; -use StdClass; +use Espo\Services\App as Service; + +use stdClass; class App implements - - Di\ServiceFactoryAware, Di\InjectableFactoryAware { - use Di\ServiceFactorySetter; use Di\InjectableFactorySetter; - public function getActionUser(): StdClass + public function getActionUser(): stdClass { - return (object) $this->serviceFactory->create('App')->getUserData(); + return (object) $this->getService()->getUserData(); } public function postActionDestroyAuthToken(Request $request, Response $response): bool @@ -63,4 +62,9 @@ class App implements return $auth->destroyAuthToken($data->token, $request, $response); } + + private function getService(): Service + { + return $this->injectableFactory->create(Service::class); + } } diff --git a/application/Espo/Controllers/Email.php b/application/Espo/Controllers/Email.php index 0eece929a4..b85175d95f 100644 --- a/application/Espo/Controllers/Email.php +++ b/application/Espo/Controllers/Email.php @@ -39,6 +39,8 @@ use Espo\Core\Api\Request; use Espo\Services\Email as Service; use Espo\Services\EmailTemplate as EmailTemplateService; +use Espo\Core\Utils\Crypt; + use stdClass; class Email extends Record @@ -82,9 +84,7 @@ class Email extends Record } if (is_null($data->password)) { - $data->password = $this->getContainer() - ->get('crypt') - ->decrypt($preferences->get('smtpPassword')); + $data->password = $this->getCrypt()->decrypt($preferences->get('smtpPassword')); } } else if ($data->type == 'emailAccount') { @@ -105,10 +105,9 @@ class Email extends Record throw new Forbidden(); } } + if (is_null($data->password)) { - $data->password = $this->getContainer() - ->get('crypt') - ->decrypt($emailAccount->get('smtpPassword')); + $data->password = $this->getCrypt()->decrypt($emailAccount->get('smtpPassword')); } } } @@ -125,9 +124,7 @@ class Email extends Record } if (is_null($data->password)) { - $data->password = $this->getContainer() - ->get('crypt') - ->decrypt($emailAccount->get('smtpPassword')); + $data->password = $this->getCrypt()->decrypt($emailAccount->get('smtpPassword')); } } } @@ -332,4 +329,10 @@ class Email extends Record /** @var EmailTemplateService */ return $this->getServiceFactory()->create('EmailTemplate'); } + + private function getCrypt(): Crypt + { + /** @var Crypt */ + return $this->getContainer()->get('crypt'); + } } diff --git a/application/Espo/Controllers/EntityManager.php b/application/Espo/Controllers/EntityManager.php index b5373f7ff2..b37e466d49 100644 --- a/application/Espo/Controllers/EntityManager.php +++ b/application/Espo/Controllers/EntityManager.php @@ -72,46 +72,62 @@ class EntityManager $name = filter_var($name, \FILTER_SANITIZE_STRING); $type = filter_var($type, \FILTER_SANITIZE_STRING); + if (!is_string($name) || !is_string($type)) { + throw new BadRequest(); + } + $params = []; if (!empty($data['labelSingular'])) { $params['labelSingular'] = $data['labelSingular']; } + if (!empty($data['labelPlural'])) { $params['labelPlural'] = $data['labelPlural']; } + if (!empty($data['stream'])) { $params['stream'] = $data['stream']; } + if (!empty($data['disabled'])) { $params['disabled'] = $data['disabled']; } + if (!empty($data['sortBy'])) { $params['sortBy'] = $data['sortBy']; } + if (!empty($data['sortDirection'])) { $params['asc'] = $data['sortDirection'] === 'asc'; } + if (isset($data['textFilterFields']) && is_array($data['textFilterFields'])) { $params['textFilterFields'] = $data['textFilterFields']; } + if (!empty($data['color'])) { $params['color'] = $data['color']; } + if (!empty($data['iconClass'])) { $params['iconClass'] = $data['iconClass']; } + if (isset($data['fullTextSearch'])) { $params['fullTextSearch'] = $data['fullTextSearch']; } + if (isset($data['countDisabled'])) { $params['countDisabled'] = $data['countDisabled']; } + if (isset($data['optimisticConcurrencyControl'])) { $params['optimisticConcurrencyControl'] = $data['optimisticConcurrencyControl']; } $params['kanbanViewMode'] = !empty($data['kanbanViewMode']); + if (!empty($data['kanbanStatusIgnoreList'])) { $params['kanbanStatusIgnoreList'] = $data['kanbanStatusIgnoreList']; } @@ -135,6 +151,10 @@ class EntityManager $name = filter_var($name, \FILTER_SANITIZE_STRING); + if (!is_string($name)) { + throw new BadRequest(); + } + $this->entityManagerTool->update($name, $data); return true; @@ -154,6 +174,10 @@ class EntityManager $name = filter_var($name, \FILTER_SANITIZE_STRING); + if (!is_string($name)) { + throw new BadRequest(); + } + $this->entityManagerTool->delete($name); return true; @@ -198,6 +222,7 @@ class EntityManager if (array_key_exists('linkMultipleField', $data)) { $params['linkMultipleField'] = $data['linkMultipleField']; } + if (array_key_exists('linkMultipleFieldForeign', $data)) { $params['linkMultipleFieldForeign'] = $data['linkMultipleFieldForeign']; } @@ -205,16 +230,35 @@ class EntityManager if (array_key_exists('audited', $data)) { $params['audited'] = $data['audited']; } + if (array_key_exists('auditedForeign', $data)) { $params['auditedForeign'] = $data['auditedForeign']; } + if (array_key_exists('parentEntityTypeList', $data)) { $params['parentEntityTypeList'] = $data['parentEntityTypeList']; } + if (array_key_exists('foreignLinkEntityTypeList', $data)) { $params['foreignLinkEntityTypeList'] = $data['foreignLinkEntityTypeList']; } + /** @var array{ + * linkType: string, + * entity: string, + * link: string, + * entityForeign: string, + * linkForeign: string, + * label: string, + * labelForeign: string, + * relationName?: ?string, + * linkMultipleField?: bool, + * linkMultipleFieldForeign?: bool, + * audited?: bool, + * auditedForeign?: bool, + * } $params + */ + $this->entityManagerTool->createLink($params); return true; @@ -253,16 +297,36 @@ class EntityManager if (array_key_exists('audited', $data)) { $params['audited'] = $data['audited']; } + if (array_key_exists('auditedForeign', $data)) { $params['auditedForeign'] = $data['auditedForeign']; } + if (array_key_exists('parentEntityTypeList', $data)) { $params['parentEntityTypeList'] = $data['parentEntityTypeList']; } + if (array_key_exists('foreignLinkEntityTypeList', $data)) { $params['foreignLinkEntityTypeList'] = $data['foreignLinkEntityTypeList']; } + /** + * @var array{ + * entity: string, + * link: string, + * entityForeign?: ?string, + * linkForeign?: ?string, + * label?: string, + * labelForeign?: string, + * linkMultipleField?: bool, + * linkMultipleFieldForeign?: bool, + * audited?: bool, + * auditedForeign?: bool, + * parentEntityTypeList?: string[], + * foreignLinkEntityTypeList?: string[], + * } $params + */ + $this->entityManagerTool->updateLink($params); return true; @@ -279,13 +343,20 @@ class EntityManager 'link', ]; - $d = []; + $params = []; foreach ($paramList as $item) { - $d[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING); + $params[$item] = filter_var($data[$item], \FILTER_SANITIZE_STRING); } - $this->entityManagerTool->deleteLink($d); + /** + * @var array{ + * entity?: string, + * link?: string, + * } $params + */ + + $this->entityManagerTool->deleteLink($params); return true; } diff --git a/application/Espo/Controllers/Export.php b/application/Espo/Controllers/Export.php index 6f3e37ccc9..b1702dfa0e 100644 --- a/application/Espo/Controllers/Export.php +++ b/application/Espo/Controllers/Export.php @@ -33,6 +33,8 @@ use Espo\Core\Api\Request; use Espo\Core\Api\Response; use Espo\Core\Exceptions\BadRequest; +use Espo\Core\Utils\Json; + use Espo\Tools\Export\Service; use Espo\Tools\Export\ServiceParams; use Espo\Tools\Export\Params; @@ -112,11 +114,11 @@ class Export if (!is_null($where) || !is_null($searchParams)) { if (!is_null($where)) { - $params['where'] = json_decode(json_encode($where), true); + $params['where'] = json_decode(Json::encode($where), true); } if (!is_null($searchParams)) { - $params['searchParams'] = json_decode(json_encode($searchParams), true); + $params['searchParams'] = json_decode(Json::encode($searchParams), true); } } else if (!is_null($ids)) { diff --git a/application/Espo/Controllers/ExternalAccount.php b/application/Espo/Controllers/ExternalAccount.php index 925a851255..928a383701 100644 --- a/application/Espo/Controllers/ExternalAccount.php +++ b/application/Espo/Controllers/ExternalAccount.php @@ -64,9 +64,11 @@ class ExternalAccount extends RecordBase $entity->get('enabled') && $this->metadata->get('integrations.' . $entity->getId() .'.allowUserAccounts') ) { + /** @var string */ + $id = $entity->getId(); $userAccountAclScope = $this->metadata - ->get(['integrations', $entity->getId(), 'userAccountAclScope']); + ->get(['integrations', $id, 'userAccountAclScope']); if ($userAccountAclScope) { if (!$this->acl->checkScope($userAccountAclScope)) { @@ -75,7 +77,7 @@ class ExternalAccount extends RecordBase } $list[] = [ - 'id' => $entity->getId(), + 'id' => $id, ]; } } diff --git a/application/Espo/Controllers/LastViewed.php b/application/Espo/Controllers/LastViewed.php index 9912e7594f..72cc049377 100644 --- a/application/Espo/Controllers/LastViewed.php +++ b/application/Espo/Controllers/LastViewed.php @@ -65,8 +65,8 @@ class LastViewed $result = $this->service->getList($params); return (object) [ - 'total' => $result->total, - 'list' => $result->collection->getValueMapList(), + 'total' => $result['total'], + 'list' => $result['collection']->getValueMapList(), ]; } } diff --git a/application/Espo/Controllers/MassAction.php b/application/Espo/Controllers/MassAction.php index d098322997..340caf247a 100644 --- a/application/Espo/Controllers/MassAction.php +++ b/application/Espo/Controllers/MassAction.php @@ -40,6 +40,8 @@ use Espo\Core\MassAction\ServiceParams; use Espo\Core\Api\Request; use Espo\Core\Api\Response; +use Espo\Core\Utils\Json; + use stdClass; use RuntimeException; @@ -128,11 +130,11 @@ class MassAction $params = []; if (!is_null($where)) { - $params['where'] = json_decode(json_encode($where), true); + $params['where'] = json_decode(Json::encode($where), true); } if (!is_null($searchParams)) { - $params['searchParams'] = json_decode(json_encode($searchParams), true); + $params['searchParams'] = json_decode(Json::encode($searchParams), true); } return $params; diff --git a/application/Espo/Controllers/Metadata.php b/application/Espo/Controllers/Metadata.php index 463832bb77..72aa1253dd 100644 --- a/application/Espo/Controllers/Metadata.php +++ b/application/Espo/Controllers/Metadata.php @@ -63,6 +63,7 @@ class Metadata extends Base private function getMetadataService(): Service { + /** @var Service */ return $this->getServiceFactory()->create('Metadata'); } } diff --git a/application/Espo/Controllers/User.php b/application/Espo/Controllers/User.php index a0e56d8816..c8c5e4b448 100644 --- a/application/Espo/Controllers/User.php +++ b/application/Espo/Controllers/User.php @@ -212,6 +212,7 @@ class User extends Record private function getUserService(): Service { + /** @var Service */ return $this->getServiceFactory()->create('User'); } } diff --git a/application/Espo/Services/LastViewed.php b/application/Espo/Services/LastViewed.php index f404656484..97d3670504 100644 --- a/application/Espo/Services/LastViewed.php +++ b/application/Espo/Services/LastViewed.php @@ -64,11 +64,15 @@ class LastViewed /** * @param array{ - * offset: int, - * maxSize: int, + * offset: ?int, + * maxSize: ?int, * } $params + * @return array{ + * total: int, + * collection: \Espo\ORM\Collection<\Espo\Entities\ActionHistoryRecord>, + * } */ - public function getList(array $params): object + public function getList(array $params): array { $repository = $this->entityManager->getRDBRepository('ActionHistoryRecord'); @@ -81,9 +85,10 @@ class LastViewed } ); - $offset = $params['offset']; - $maxSize = $params['maxSize']; + $offset = $params['offset'] ?? 0; + $maxSize = $params['maxSize'] ?? 0; + /** @var \Espo\ORM\Collection<\Espo\Entities\ActionHistoryRecord> */ $collection = $repository ->where([ 'userId' => $this->user->getId(), @@ -121,7 +126,7 @@ class LastViewed $total = -2; } - return (object) [ + return [ 'total' => $total, 'collection' => $collection, ];