Skip to content

Commit

Permalink
OXDEV-9135 Optimize module installation
Browse files Browse the repository at this point in the history
  • Loading branch information
godefroy-le-hardi committed Feb 28, 2025
1 parent 2a66ae6 commit cb281a4
Show file tree
Hide file tree
Showing 12 changed files with 70 additions and 73 deletions.
1 change: 1 addition & 0 deletions CHANGELOG-7.3.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
- Raised minimum required version of Symfony components to 6.4
- Set the default value of blSkipDebitOldBankInfo to true
- Add to basket does not force a refresh of order confirmation step [#0007254](https://bugs.oxid-esales.com/view.php?id=7254)
- Optimized module installation/uninstallation process

### Removed
- PHPUnit v10 support
Expand Down
18 changes: 8 additions & 10 deletions source/Application/Controller/Admin/ModuleSortList.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@
namespace OxidEsales\EshopCommunity\Application\Controller\Admin;

use OxidEsales\Eshop\Core\Registry;
use OxidEsales\EshopCommunity\Core\Di\ContainerFacade;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Bridge\ShopConfigurationDaoBridgeInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\Chain\ClassExtensionsChainDaoInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\DataObject\ClassExtensionsChain;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\DataObject\ShopConfiguration;
use OxidEsales\EshopCommunity\Internal\Transition\Utility\ContextInterface;

/**
* Extensions sorting list handler.
Expand Down Expand Up @@ -72,16 +76,10 @@ public function save()

$sanitizedClassExtensionsChain = $this->sanitizeClassExtensionsChain($classExtensionsChainFromRequest);

$container = $this->getContainer();
$shopConfigurationDao = $container->get(ShopConfigurationDaoBridgeInterface::class);
$shopConfiguration = $shopConfigurationDao->get();

$chain = $shopConfiguration->getClassExtensionsChain();
$chain->setChain($sanitizedClassExtensionsChain);

$shopConfiguration->setClassExtensionsChain($chain);

$shopConfigurationDao->save($shopConfiguration);
ContainerFacade::get(ClassExtensionsChainDaoInterface::class)->saveChain(
ContainerFacade::get(ContextInterface::class)->getCurrentShopId(),
new ClassExtensionsChain($sanitizedClassExtensionsChain)
);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
namespace OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Bridge;

use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\ShopConfigurationDaoInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\ModuleEnvironmentConfigurationDaoInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\DataObject\ShopConfiguration;
use OxidEsales\EshopCommunity\Internal\Transition\Utility\ContextInterface;

Expand All @@ -22,19 +21,13 @@ public function __construct(
) {
}

/**
* @return ShopConfiguration
*/
public function get(): ShopConfiguration
{
return $this->shopConfigurationDao->get(
$this->context->getCurrentShopId()
);
}

/**
* @param ShopConfiguration $shopConfiguration
*/
public function save(ShopConfiguration $shopConfiguration)
{
$this->shopConfigurationDao->save(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,10 @@
*/
interface ShopConfigurationDaoBridgeInterface
{
/**
* @return ShopConfiguration
*/
public function get(): ShopConfiguration;

/**
* @param ShopConfiguration $shopConfiguration
* @deprecated use ModuleConfigurationDaoInterface::save() and ClassExtensionsChainDaoInterface::saveChain() instead
*/
public function save(ShopConfiguration $shopConfiguration);
}
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ public function deleteAll(int $shopId): void
$this->filesystem->remove($this->getModulesConfigurationDirectory($shopId));
}

public function delete(string $moduleId, int $shopId): void
{
$this->filesystem->remove($this->getModuleConfigurationFilePath($shopId, $moduleId));
}

public function exists(string $moduleId, int $shopId): bool
{
return in_array($moduleId, $this->getModuleIds($shopId), true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,12 @@

interface ModuleConfigurationDaoInterface
{
/**
* @param string $moduleId
* @param int $shopId
* @return ModuleConfiguration
*/
public function get(string $moduleId, int $shopId): ModuleConfiguration;

/**
* @param ModuleConfiguration $moduleConfiguration
* @param int $shopId
*/
public function save(ModuleConfiguration $moduleConfiguration, int $shopId);

public function delete(string $moduleId, int $shopId): void;

/**
* @param int $shopId
* @return ModuleConfiguration[]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ interface ShopConfigurationDaoInterface
public function get(int $shopId): ShopConfiguration;

/**
* @param ShopConfiguration $shopConfiguration
* @param int $shopId
* @deprecated use ModuleConfigurationDaoInterface::save() and ClassExtensionsChainDaoInterface::saveChain() instead
*/
public function save(ShopConfiguration $shopConfiguration, int $shopId): void;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ services:

OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\Chain\ClassExtensionsChainDaoInterface:
class: OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\Chain\ClassExtensionsChainDao
public: true

OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\Chain\TemplateExtensionChainDaoInterface:
class: OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\Chain\TemplateExtensionChainDao
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@

namespace OxidEsales\EshopCommunity\Internal\Framework\Module\Install\Service;

use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\Chain\ClassExtensionsChainDaoInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\ModuleConfigurationDaoInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\ShopConfigurationDaoInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Exception\ModuleConfigurationNotFoundException;
use OxidEsales\EshopCommunity\Internal\Framework\Module\MetaData\Dao\ModuleConfigurationDaoInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\DataObject\ModuleConfiguration;
use OxidEsales\EshopCommunity\Internal\Framework\Module\MetaData\Dao\ModuleConfigurationDaoInterface as MetadataDaoInterface;
use OxidEsales\EshopCommunity\Internal\Transition\Utility\BasicContextInterface;
use Symfony\Component\Filesystem\Path;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Service\{
Expand All @@ -24,81 +26,69 @@ public function __construct(
private ShopConfigurationDaoInterface $shopConfigurationDao,
private BasicContextInterface $context,
private ModuleConfigurationMergingServiceInterface $moduleConfigurationMergingService,
private ModuleConfigurationDaoInterface $metadataModuleConfigurationDao
private MetadataDaoInterface $metadataModuleConfigurationDao,
private ModuleConfigurationDaoInterface $moduleConfigurationDao,
private ClassExtensionsChainDaoInterface $classExtensionsChainDao
) {
}

/**
* @param string $moduleSourcePath
*/
public function install(string $moduleSourcePath): void
{
$moduleConfiguration = $this->metadataModuleConfigurationDao->get($moduleSourcePath);
$moduleConfiguration->setModuleSource($this->getModuleSourceRelativePath($moduleSourcePath));

foreach ($this->shopConfigurationDao->getAll() as $shopId => $shopConfiguration) {
$this->moduleConfigurationMergingService->merge($shopConfiguration, $moduleConfiguration);
$this->shopConfigurationDao->save($shopConfiguration, $shopId);
$mergedModuleConfiguration = $this
->moduleConfigurationMergingService
->merge($shopConfiguration, $moduleConfiguration)
->getModuleConfiguration($moduleConfiguration->getId());

$this->moduleConfigurationDao->save($mergedModuleConfiguration, $shopId);
$this->classExtensionsChainDao->saveChain($shopId, $shopConfiguration->getClassExtensionsChain());
}
}

/**
* @param string $moduleSourcePath
*
* @throws ModuleConfigurationNotFoundException
*/
public function uninstall(string $moduleSourcePath): void
{
$moduleConfiguration = $this->metadataModuleConfigurationDao->get($moduleSourcePath);

foreach ($this->shopConfigurationDao->getAll() as $shopId => $shopConfiguration) {
if ($shopConfiguration->hasModuleConfiguration($moduleConfiguration->getId())) {
$shopConfiguration->deleteModuleConfiguration($moduleConfiguration->getId());
$this->removeModuleConfiguration($moduleConfiguration, $shopId);
}
$this->shopConfigurationDao->save($shopConfiguration, $shopId);
}
}

/**
* @param string $moduleId
*
* @throws ModuleConfigurationNotFoundException
*/
public function uninstallById(string $moduleId): void
{
foreach ($this->shopConfigurationDao->getAll() as $shopId => $shopConfiguration) {
if ($shopConfiguration->hasModuleConfiguration($moduleId)) {
$shopConfiguration->deleteModuleConfiguration($moduleId);
$this->removeModuleConfiguration($shopConfiguration->getModuleConfiguration($moduleId), $shopId);
}
$this->shopConfigurationDao->save($shopConfiguration, $shopId);
}
}

/**
* @param string $moduleSourcePath
*
* @return bool
*/
public function isInstalled(string $moduleSourcePath): bool
{
$moduleConfiguration = $this->metadataModuleConfigurationDao->get($moduleSourcePath);

foreach ($this->shopConfigurationDao->getAll() as $shopId => $shopConfiguration) {
if ($shopConfiguration->hasModuleConfiguration($moduleConfiguration->getId())) {
return true;
}
}

return false;
return $this->shopConfigurationDao->get($this->context->getDefaultShopId())
->hasModuleConfiguration($moduleConfiguration->getId());
}

/**
* @param string $moduleSourcePath
*
* @return string
*/
private function getModuleSourceRelativePath(string $moduleSourcePath): string
{
return Path::makeRelative($moduleSourcePath, $this->context->getShopRootPath());
}

public function removeModuleConfiguration(ModuleConfiguration $moduleConfiguration, int $shopId): void
{
$this->moduleConfigurationDao->delete($moduleConfiguration->getId(), $shopId);

$chain = $this->classExtensionsChainDao->getChain($shopId);
foreach ($moduleConfiguration->getClassExtensions() as $classExtension) {
$chain->removeExtension($classExtension);
}
$this->classExtensionsChainDao->saveChain($shopId, $chain);
}
}
1 change: 0 additions & 1 deletion tests/ContainerTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
use UnitEnum;

/**
* @internal
* @mixin Container
*/
trait ContainerTrait
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,23 @@ public function testGetAllOrdersConfigurationsById(): void



public function testDelete(): void
{
$moduleConfiguration = new ModuleConfiguration();
$moduleConfiguration
->setId('testDeleteId')
->setModuleSource('test');

$dao = $this->get(ModuleConfigurationDaoInterface::class);
$dao->save($moduleConfiguration, 1);

$this->assertTrue($dao->exists('testDeleteId', 1));

$dao->delete('testDeleteId', 1);

$this->assertFalse($dao->exists('testDeleteId', 1));
}

public function testDeleteAll(): void
{
$moduleConfiguration = new ModuleConfiguration();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

namespace OxidEsales\EshopCommunity\Tests\Integration\Internal\Framework\Module\Install\Service;

use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\Chain\ClassExtensionsChainDaoInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\ModuleConfigurationDaoInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\Dao\ProjectConfigurationDaoInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Module\Configuration\DataMapper\{
Expand Down Expand Up @@ -171,8 +172,11 @@ private function assertProjectConfigurationHasModuleConfigurationForAllShops():

private function assertModuleConfigurationDeletedForAllShops(): void
{
foreach ($this->get(ShopConfigurationDaoInterface::class)->getAll() as $shopConfiguration) {
foreach ($this->get(ShopConfigurationDaoInterface::class)->getAll() as $shopId => $shopConfiguration) {
$this->assertFalse($shopConfiguration->hasModuleConfiguration($this->testModuleId));

$chain = $this->get(ClassExtensionsChainDaoInterface::class)->getChain($shopId)->getChain();
$this->assertNotContains('testModuleClassExtendsShopClass', $chain['shopClass'] ?? []);
}
}

Expand Down

0 comments on commit cb281a4

Please sign in to comment.