From 738f483aefb076a157e441e6104c4d3ba64cc0e9 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Thu, 20 Feb 2025 21:12:11 +0200 Subject: [PATCH] integration populate defaults on rebuild --- .../Actions/SetIntegrationDefaults.php | 86 +++++++++++++++++++ application/Espo/Entities/Integration.php | 12 +-- .../Espo/Resources/metadata/app/rebuild.json | 3 +- 3 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 application/Espo/Core/Rebuild/Actions/SetIntegrationDefaults.php diff --git a/application/Espo/Core/Rebuild/Actions/SetIntegrationDefaults.php b/application/Espo/Core/Rebuild/Actions/SetIntegrationDefaults.php new file mode 100644 index 0000000000..2af313e80d --- /dev/null +++ b/application/Espo/Core/Rebuild/Actions/SetIntegrationDefaults.php @@ -0,0 +1,86 @@ +. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +namespace Espo\Core\Rebuild\Actions; + +use Espo\Core\Rebuild\RebuildAction; +use Espo\Core\Utils\Metadata; +use Espo\Entities\Integration; +use Espo\ORM\EntityManager; + +/** + * @noinspection PhpUnused + */ +class SetIntegrationDefaults implements RebuildAction +{ + public function __construct( + private Metadata $metadata, + private EntityManager $entityManager, + ) {} + + public function process(): void + { + /** @var string[] $integrations */ + $integrations = array_keys($this->metadata->get('integrations') ?? []); + + foreach ($integrations as $integration) { + $this->processItem($integration); + } + } + + private function processItem(string $name): void + { + $integration = $this->entityManager + ->getRDBRepositoryByClass(Integration::class) + ->getById($name); + + if (!$integration || !$integration->isEnabled()) { + return; + } + + /** @var array> $fields */ + $fields = $this->metadata->get("integrations.$name.fields") ?? []; + + foreach ($fields as $field => $defs) { + $default = $defs['default'] ?? null; + + if ($default === null) { + continue; + } + + if ($integration->has($field)) { + continue; + } + + $integration->set($field, $default); + } + + $this->entityManager->saveEntity($integration); + } +} diff --git a/application/Espo/Entities/Integration.php b/application/Espo/Entities/Integration.php index 723348cd96..2601c9e240 100644 --- a/application/Espo/Entities/Integration.php +++ b/application/Espo/Entities/Integration.php @@ -103,14 +103,16 @@ class Integration extends Entity if ($this->hasAttribute($name)) { $this->setInContainer($name, $value); - } else { - $data = $this->getData(); - $data->$name = $value; - - $this->set(self::ATTR_DATA, $data); + return $this; } + $data = $this->getData(); + + $data->$name = $value; + + $this->set(self::ATTR_DATA, $data); + return $this; } diff --git a/application/Espo/Resources/metadata/app/rebuild.json b/application/Espo/Resources/metadata/app/rebuild.json index 5a6009d97e..b401a843fb 100644 --- a/application/Espo/Resources/metadata/app/rebuild.json +++ b/application/Espo/Resources/metadata/app/rebuild.json @@ -5,6 +5,7 @@ "Espo\\Core\\Rebuild\\Actions\\CurrencyRates", "Espo\\Core\\Rebuild\\Actions\\ScheduledJobs", "Espo\\Core\\Rebuild\\Actions\\ConfigMetadataCheck", - "Espo\\Core\\Rebuild\\Actions\\GenerateInstanceId" + "Espo\\Core\\Rebuild\\Actions\\GenerateInstanceId", + "Espo\\Core\\Rebuild\\Actions\\SetIntegrationDefaults" ] }