From d3e65f9ba14d7c9a8514de1bfbb1fcfca03776ca Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Tue, 18 Oct 2022 18:16:10 +0300 Subject: [PATCH] ref --- application/Espo/Controllers/Email.php | 20 +- application/Espo/Services/EmailTemplate.php | 114 ----------- .../Espo/Tools/EmailTemplate/Formatter.php | 14 +- .../EmailTemplate/InsertField/Service.php | 179 ++++++++++++++++++ 4 files changed, 192 insertions(+), 135 deletions(-) create mode 100644 application/Espo/Tools/EmailTemplate/InsertField/Service.php diff --git a/application/Espo/Controllers/Email.php b/application/Espo/Controllers/Email.php index b4650d5972..40442def27 100644 --- a/application/Espo/Controllers/Email.php +++ b/application/Espo/Controllers/Email.php @@ -41,11 +41,11 @@ use Espo\Core\Api\Request; use Espo\Core\Mail\SmtpParams; use Espo\Entities\Email as EmailEntity; use Espo\Services\Email as Service; -use Espo\Services\EmailTemplate as EmailTemplateService; use Espo\Tools\Email\SendService; use Espo\Tools\Email\Service as ToolService; use Espo\Tools\Email\TestSendData; +use Espo\Tools\EmailTemplate\InsertField\Service as InsertFieldService; use stdClass; class Email extends Record @@ -331,11 +331,13 @@ class Email extends Record throw new Forbidden(); } - return $this->getEmailTemplateService()->getInsertFieldData([ - 'parentId' => $request->getQueryParam('parentId'), - 'parentType' => $request->getQueryParam('parentType'), - 'to' => $request->getQueryParam('to'), - ]); + return $this->injectableFactory + ->create(InsertFieldService::class) + ->getData( + $request->getQueryParam('parentType'), + $request->getQueryParam('parentId'), + $request->getQueryParam('to') + ); } private function getEmailToolService(): ToolService @@ -353,10 +355,4 @@ class Email extends Record /** @var Service */ return $this->getRecordService(); } - - private function getEmailTemplateService(): EmailTemplateService - { - /** @var EmailTemplateService */ - return $this->getServiceFactory()->create('EmailTemplate'); - } } diff --git a/application/Espo/Services/EmailTemplate.php b/application/Espo/Services/EmailTemplate.php index e4e9c40d33..3ebda6efee 100644 --- a/application/Espo/Services/EmailTemplate.php +++ b/application/Espo/Services/EmailTemplate.php @@ -30,22 +30,13 @@ namespace Espo\Services; use Espo\Core\Exceptions\Forbidden; -use Espo\Repositories\EmailAddress as EmailAddressRepository; - use Espo\Tools\EmailTemplate\Processor; use Espo\Tools\EmailTemplate\Params; use Espo\Tools\EmailTemplate\Data; -use Espo\Tools\EmailTemplate\Formatter; - use Espo\Entities\EmailTemplate as EmailTemplateEntity; -use Espo\Entities\EmailAddress; - use Espo\Core\Exceptions\NotFound; - use Espo\Core\Di; -use stdClass; - /** * @deprecated For bc. Use `Espo\Tools\EmailTemplate\Service`. * @@ -123,113 +114,8 @@ class EmailTemplate extends Record implements return $this->parseTemplate($emailTemplate, $params, $copyAttachments); } - /** - * @param array $params - */ - public function getInsertFieldData(array $params): stdClass - { - $to = $params['to'] ?? null; - $parentId = $params['parentId'] ?? null; - $parentType = $params['parentType'] ?? null; - - $result = (object) []; - - $dataList = []; - - if ($parentId && $parentType) { - $e = $this->entityManager->getEntity($parentType, $parentId); - - if ($e && $this->acl->check($e)) { - $dataList[] = [ - 'type' => 'parent', - 'entity' => $e, - ]; - } - } - - if ($to) { - $e = $this->getEmailAddressRepository()->getEntityByAddress($to, null, ['Contact', 'Lead', 'Account']); - - if ($e && $e->getEntityType() !== 'User' && $this->acl->check($e)) { - $dataList[] = [ - 'type' => 'to', - 'entity' => $e, - ]; - } - } - - $fm = $this->fieldUtil; - - $formatter = $this->createFormatter(); - - foreach ($dataList as $item) { - $type = $item['type']; - $e = $item['entity']; - - $entityType = $e->getEntityType(); - - $recordService = $this->recordServiceContainer->get($entityType); - - $recordService->prepareEntityForOutput($e); - - $ignoreTypeList = ['image', 'file', 'map', 'wysiwyg', 'linkMultiple', 'attachmentMultiple', 'bool']; - - foreach ($fm->getEntityTypeFieldList($entityType) as $field) { - $fieldType = $fm->getEntityTypeFieldParam($entityType, $field, 'type'); - $fieldAttributeList = $fm->getAttributeList($entityType, $field); - - if ( - $fm->getEntityTypeFieldParam($entityType, $field, 'disabled') || - $fm->getEntityTypeFieldParam($entityType, $field, 'directAccessDisabled') || - $fm->getEntityTypeFieldParam($entityType, $field, 'templatePlaceholderDisabled') || - in_array($fieldType, $ignoreTypeList) - ) { - foreach ($fieldAttributeList as $a) { - $e->clear($a); - } - } - } - - $attributeList = $fm->getEntityTypeAttributeList($entityType); - - $values = (object) []; - - foreach ($attributeList as $a) { - if (!$e->has($a)) { - continue; - } - - $value = $formatter->formatAttributeValue($e, $a); - - if ($value !== null && $value !== '') { - $values->$a = $value; - } - } - - $result->$type = (object) [ - 'entityType' => $e->getEntityType(), - 'id' => $e->getId(), - 'values' => $values, - 'name' => $e->get('name'), - ]; - } - - return $result; - } - private function createProcessor(): Processor { return $this->injectableFactory->create(Processor::class); } - - private function createFormatter(): Formatter - { - return $this->injectableFactory->create(Formatter::class); - } - - private function getEmailAddressRepository(): EmailAddressRepository - { - /** @var EmailAddressRepository */ - return $this->entityManager->getRepository(EmailAddress::ENTITY_TYPE); - } } diff --git a/application/Espo/Tools/EmailTemplate/Formatter.php b/application/Espo/Tools/EmailTemplate/Formatter.php index 146363e4f5..f7b2e156ab 100644 --- a/application/Espo/Tools/EmailTemplate/Formatter.php +++ b/application/Espo/Tools/EmailTemplate/Formatter.php @@ -39,15 +39,11 @@ use Espo\Core\Utils\Language; class Formatter { - private $metadata; - - private $config; - - private $dateTime; - - private $number; - - private $language; + private Metadata $metadata; + private Config $config; + private DateTimeUtil $dateTime; + private NumberUtil $number; + private Language $language; public function __construct( Metadata $metadata, diff --git a/application/Espo/Tools/EmailTemplate/InsertField/Service.php b/application/Espo/Tools/EmailTemplate/InsertField/Service.php new file mode 100644 index 0000000000..79ea0ee511 --- /dev/null +++ b/application/Espo/Tools/EmailTemplate/InsertField/Service.php @@ -0,0 +1,179 @@ +entityManager = $entityManager; + $this->acl = $acl; + $this->formatter = $formatter; + $this->fieldUtil = $fieldUtil; + $this->recordServiceContainer = $recordServiceContainer; + } + + /** + * @throws Forbidden + */ + public function getData(?string $parentType, ?string $parentId, ?string $to): stdClass + { + if (!$this->acl->checkScope(Email::ENTITY_TYPE, Table::ACTION_CREATE)) { + throw new Forbidden(); + } + + $result = (object) []; + + $dataList = []; + + if ($parentId && $parentType) { + $e = $this->entityManager->getEntityById($parentType, $parentId); + + if ($e && $this->acl->check($e)) { + $dataList[] = [ + 'type' => 'parent', + 'entity' => $e, + ]; + } + } + + if ($to) { + $e = $this->getEmailAddressRepository() + ->getEntityByAddress($to, null, + [Contact::ENTITY_TYPE, Lead::ENTITY_TYPE, Account::ENTITY_TYPE]); + + if ($e && $e->getEntityType() !== User::ENTITY_TYPE && $this->acl->check($e)) { + $dataList[] = [ + 'type' => 'to', + 'entity' => $e, + ]; + } + } + + $fm = $this->fieldUtil; + + $formatter = $this->formatter; + + foreach ($dataList as $item) { + $type = $item['type']; + $e = $item['entity']; + + $entityType = $e->getEntityType(); + + $recordService = $this->recordServiceContainer->get($entityType); + + $recordService->prepareEntityForOutput($e); + + $ignoreTypeList = [ + 'image', + 'file', + 'map', + 'wysiwyg', + 'linkMultiple', + 'attachmentMultiple', + 'bool', + ]; + + foreach ($fm->getEntityTypeFieldList($entityType) as $field) { + $fieldType = $fm->getEntityTypeFieldParam($entityType, $field, 'type'); + $fieldAttributeList = $fm->getAttributeList($entityType, $field); + + if ( + $fm->getEntityTypeFieldParam($entityType, $field, 'disabled') || + $fm->getEntityTypeFieldParam($entityType, $field, 'directAccessDisabled') || + $fm->getEntityTypeFieldParam($entityType, $field, 'templatePlaceholderDisabled') || + in_array($fieldType, $ignoreTypeList) + ) { + foreach ($fieldAttributeList as $a) { + $e->clear($a); + } + } + } + + $attributeList = $fm->getEntityTypeAttributeList($entityType); + + $values = (object) []; + + foreach ($attributeList as $a) { + if (!$e->has($a)) { + continue; + } + + $value = $formatter->formatAttributeValue($e, $a); + + if ($value !== null && $value !== '') { + $values->$a = $value; + } + } + + $result->$type = (object) [ + 'entityType' => $e->getEntityType(), + 'id' => $e->getId(), + 'values' => $values, + 'name' => $e->get('name'), + ]; + } + + return $result; + } + + private function getEmailAddressRepository(): EmailAddressRepository + { + /** @var EmailAddressRepository */ + return $this->entityManager->getRepository(EmailAddress::ENTITY_TYPE); + } +}