Skip to content

Commit

Permalink
Merge pull request Smile-SA#3495 from rbayet/feat-healthcheck-compose…
Browse files Browse the repository at this point in the history
…r-mismatch

[Healtchecks] Composer version mismatch check (for OS and ESP packages)
  • Loading branch information
rbayet committed Jan 23, 2025
2 parents d6703ba + f12cdac commit 83df5fb
Show file tree
Hide file tree
Showing 9 changed files with 396 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
<?php
/**
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade this module to newer versions in the future.
*
* @category Smile
* @package Smile\ElasticsuiteCore
* @author Richard BAYET <[email protected]>
* @copyright 2025 Smile
* @license Open Software License ("OSL") v. 3.0
*/

namespace Smile\ElasticsuiteCore\Model\Healthcheck;

use Smile\ElasticsuiteCore\Api\Healthcheck\CheckInterface;
use Smile\ElasticsuiteCore\Model\ProductMetadata\ComposerInformationProvider;

/**
* Presence of Elasticsuite Hyva compatibility module(s) check.
* Checks that, if Hyva theme package is installed,
* the specific Elasticsuite/Hyva compatibility module(s) are also installed.
*
* @category Smile
* @package Smile\ElasticsuiteCore
*/
class HyvaCompatibilityCheck implements CheckInterface
{
/** @var ComposerInformationProvider */
private $composerInformationProvider;

/** @var string */
private $triggerPackage;

/** @var boolean */
private $isHyvaInstalled;

/** @var array */
private $packagesToCheck;

/** @var array */
private $packagesErrors;

/**
* Constructor.
*
* @param ComposerInformationProvider $composerInformationProvider Composer information provider.
* @param string $triggerPackage Hÿva package name triggering the check.
* @param array $packagesToCheck Required Hÿva compatibility packages.
*/
public function __construct(
ComposerInformationProvider $composerInformationProvider,
string $triggerPackage = 'hyva-themes/magento2-default-theme',
array $packagesToCheck = []
) {
$this->composerInformationProvider = $composerInformationProvider;
$this->triggerPackage = $triggerPackage;
$this->packagesToCheck = $packagesToCheck;
}

/**
* {@inheritDoc}
*/
public function getIdentifier(): string
{
return 'hyva_compatibility_check';
}

/**
* {@inheritDoc}
*/
public function getStatus(): string
{
return ($this->hasPackagesErrors() ? 'warning' : 'success');
}

/**
* {@inheritDoc}
*/
public function getDescription(): string
{
$description = __(
'All the required Hÿva/Elasticsuite compatibility modules (%1) are correctly installed.',
implode(', ', $this->packagesToCheck)
);
if (!$this->isHyvaInstalled()) {
$description = __(
'Your site is not using the Hÿva theme, there are no specific requirements to fulfill.'
);
}

if ($this->hasPackagesErrors()) {
$errors = implode(', ', $this->getPackagesErrors());
// @codingStandardsIgnoreStart
$description = implode(
'<br />',
[
__(
'Your site uses the Hÿva theme through package <strong>%1</strong>. To work properly with Hÿva, Elasticsuite requires the installation of additional <strong>compatibility modules (%2)</strong>.',
$this->triggerPackage,
implode(', ', $this->packagesToCheck)
),
((count($this->getPackagesErrors()) > 1) ?
__(
'The compatibility modules <strong>%1 are missing</strong>. Please install them through composer.',
$errors,
) :
__(
'The compatibility module <strong>%1 is missing</strong>. Please install it through composer.',
$errors,
)
),
]
);
// @codingStandardsIgnoreEnd
}

return $description;
}

/**
* {@inheritDoc}
*/
public function getSortOrder(): int
{
return 40; // Adjust as necessary.
}

/**
* Returns true if the Hÿva theme package is installed.
*
* @return bool
*/
private function isHyvaInstalled(): bool
{
if (null === $this->isHyvaInstalled) {
$this->isHyvaInstalled = array_key_exists(
$this->triggerPackage,
$this->composerInformationProvider->getComposerInformation()->getSystemPackages()
);
}

return $this->isHyvaInstalled;
}

/**
* Return true if there is at least one system package having a mismatched composer version.
*
* @return bool
*/
private function hasPackagesErrors(): bool
{
return !empty($this->getPackagesErrors());
}

/**
* Return the list of packages having a mismatched composer version.
*
* @return array
*/
private function getPackagesErrors(): array
{
if (null === $this->packagesErrors) {
$this->packagesErrors = [];
if (!empty($this->packagesToCheck)) {
if ($this->isHyvaInstalled()) {
$systemPackages = $this->composerInformationProvider->getComposerInformation()->getSystemPackages();
foreach ($this->packagesToCheck as $packageName) {
if (false === array_key_exists($packageName, $systemPackages)) {
$this->packagesErrors[$packageName] = $packageName;
}
}
ksort($this->packagesErrors);
}
}
}

return $this->packagesErrors;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
<?php
/**
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade this module to newer versions in the future.
*
* @category Smile
* @package Smile\Elasticsuite
* @author Richard BAYET <[email protected]>
* @copyright 2025 Smile
* @license Open Software License ("OSL") v. 3.0
*/

namespace Smile\ElasticsuiteCore\Model\Healthcheck;

use Smile\ElasticsuiteCore\Api\Healthcheck\CheckInterface;
use Smile\ElasticsuiteCore\Model\ProductMetadata;
use Smile\ElasticsuiteCore\Model\ProductMetadata\ComposerInformationProvider;

/**
* Elasticsuite packages versions mismatch check.
* Checks that known Elasticsuite packages that require to be in the same version as the core package
* are actually complying with that requirement.
*
* @category Smile
* @package Smile\ElasticsuiteCore
*/
class PackageVersionsMismatchCheck implements CheckInterface
{
/** @var ProductMetadata */
private $productMetadata;

/** @var ComposerInformationProvider */
private $composerInformationProvider;

/** @var string */
private $packagesToCheck;

/** @var array */
private $packagesErrors;

/**
* Constructor.
*
* @param ProductMetadata $productMetadata Elasticsuite product metadata.
* @param ComposerInformationProvider $composerInformationProvider Composer information provider.
* @param array $packagesToCheck List of packages names to check.
*/
public function __construct(
ProductMetadata $productMetadata,
ComposerInformationProvider $composerInformationProvider,
array $packagesToCheck = []
) {
$this->productMetadata = $productMetadata;
$this->composerInformationProvider = $composerInformationProvider;
$this->packagesToCheck = $packagesToCheck;
}

/**
* {@inheritDoc}
*/
public function getIdentifier(): string
{
return 'packages_version_check';
}

/**
* {@inheritDoc}
*/
public function getStatus(): string
{
return ($this->hasPackagesErrors() ? 'warning' : 'success');
}

/**
* {@inheritDoc}
*/
public function getDescription(): string
{
$description = __(
'All additional Elasticsuite packages are in the same version as the Elasticsuite core package (smile/elasticsuite).'
);

if ($this->hasPackagesErrors()) {
$errors = [];
$errors[] = '<ul>';
foreach ($this->getPackagesErrors() as $packageName => $packageVersion) {
$errors[] = sprintf("<li>%s (<em>%s</em>)</li>", $packageName, $packageVersion);
}
$errors[] = '</ul>';

// @codingStandardsIgnoreStart
$description = implode(
'<br />',
[
__(
'Some additional Elasticsuite packages are <strong>not in the same version</strong> as the Elasticsuite core package <strong>smile/elasticsuite</strong> which is in version <strong>%1</strong>.',
$this->productMetadata->getVersion()
),
__(
'You should <strong>update</strong> either the core or those additional <strong>Elasticsuite packages through composer</strong> so they share the exact same version.'
),
__(
'Those composer packages are: %1',
implode(' ', $errors)
),
]
);
// @codingStandardsIgnoreEnd
}

return $description;
}

/**
* {@inheritDoc}
*/
public function isDisplayed(): bool
{
return true;
}

/**
* {@inheritDoc}
*/
public function getSortOrder(): int
{
return 40; // Adjust as necessary.
}

/**
* Return true if there is at least one system package having a mismatched composer version.
*
* @return bool
*/
private function hasPackagesErrors(): bool
{
return !empty($this->getPackagesErrors());
}

/**
* Return the list of packages having a mismatched composer version.
*
* @return array
*/
private function getPackagesErrors(): array
{
if (null === $this->packagesErrors) {
if (!empty($this->packagesToCheck)) {
$corePackageVersion = $this->productMetadata->getVersion();
$systemPackages = $this->composerInformationProvider->getComposerInformation()->getSystemPackages();
foreach ($this->packagesToCheck as $packageName) {
$packageVersion = $systemPackages[$packageName] ?? 'N/A';
if ($packageVersion !== $corePackageVersion) {
$this->packagesErrors[$packageName] = $packageVersion;
}
}
ksort($this->packagesErrors);
}
}

return $this->packagesErrors;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,10 @@ public function isSystemPackage($packageName = '')
return true;
}

if (preg_match('/hyva/', $packageName) == 1) {
return true;
}

return false;
}

Expand Down
10 changes: 10 additions & 0 deletions src/module-elasticsuite-core/etc/adminhtml/di.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@
<item name="ghost_indices_check" xsi:type="object">Smile\ElasticsuiteCore\Model\Healthcheck\GhostIndicesCheck</item>
<item name="primary_shards_config_check" xsi:type="object">Smile\ElasticsuiteCore\Model\Healthcheck\PrimaryShardsConfigCheck</item>
<item name="replicas_config_check" xsi:type="object">Smile\ElasticsuiteCore\Model\Healthcheck\ReplicasConfigCheck</item>
<item name="packages_version_check" xsi:type="object">Smile\ElasticsuiteCore\Model\Healthcheck\PackageVersionsMismatchCheck</item>
<item name="hyva_compatibility_check" xsi:type="object">Smile\ElasticsuiteCore\Model\Healthcheck\HyvaCompatibilityCheck</item>
</argument>
</arguments>
</type>

<type name="Smile\ElasticsuiteCore\Model\Healthcheck\HyvaCompatibilityCheck">
<arguments>
<argument name="packagesToCheck" xsi:type="array">
<item name="elasticsuite_os_compat" xsi:type="string">hyva-themes/magento2-smile-elasticsuite</item>
</argument>
</arguments>
</type>
Expand Down
8 changes: 8 additions & 0 deletions src/module-elasticsuite-core/i18n/de_DE.csv
Original file line number Diff line number Diff line change
Expand Up @@ -143,3 +143,11 @@
"The maximum number of suggested search terms that will be used for fetching results in the products and categories autocomplete boxes. Having a value greater than the ""Max Size"" defined in the ""Popular Term Autocomplete"" section above has no effect.","Die maximale Anzahl vorgeschlagener Suchbegriffe, die zum Abrufen von Ergebnissen in den Autovervollständigungsfeldern für Produkte und Kategorien verwendet werden. Ein Wert, der größer als die im Abschnitt ""Autovervollständigung geläufiger Bezeichnungen"" oben definierte ""Maximale Größe"" ist, hat keine Auswirkung."
"No extension for actual popular search terms","Keine Erweiterung für tatsächlich beliebte Suchbegriffe"
"Default: No. When set to ""Yes"", the extension mechanism will be discarded when the search term entered by the user is amongst the popular terms suggestions. Eg : When the user has finished typing ""computer"", if the list of suggested search terms is (""computer"", ""peach computer"", ""computer for kids""), only ""computer"" will be taken into account for the products and categories autocomplete.","Standard: Nein. Bei der Einstellung ""Ja"" wird der Erweiterungsmechanismus verworfen, wenn der vom Benutzer eingegebene Suchbegriff zu den Vorschlägen für beliebte Begriffe gehört. Beispiel: Wenn der Benutzer mit der Eingabe von ""Computer"" fertig ist und die Liste der vorgeschlagenen Suchbegriffe ""Computer"", ""Pfirsich Computer"", ""Computer für Kinder"" lautet, wird nur ""Computer"" für die Produkte und berücksichtigt Kategorien automatisch vervollständigen."
"Some additional Elasticsuite packages are <strong>not in the same version</strong> as the Elasticsuite core package <strong>smile/elasticsuite</strong> which is in version <strong>%1</strong>.","Einige zusätzliche Elasticsuite-Pakete sind <strong>nicht in derselben Version</strong> wie das Elasticsuite-Kernpaket <strong>smile/elasticsuite</strong>, das in der Version <strong>%1</strong> vorliegt."
"You should <strong>update</strong> either the core or those additional <strong>Elasticsuite packages through composer</strong> so they share the exact same version.","Sie sollten entweder den Kern oder diese zusätzlichen <strong>Elasticsuite-Pakete über Composer aktualisieren</strong>, damit sie genau dieselbe Version verwenden."
"Those composer packages are: %1","Diese Composer-Pakete sind: %1"
"All the required Hÿva/Elasticsuite compatibility modules (%1) are correctly installed.","Alle erforderlichen Hÿva/Elasticsuite-Kompatibilitätsmodule (%1) sind korrekt installiert."
"Your site is not using the Hÿva theme, there are no specific requirements to fulfill.","Ihre Website verwendet nicht das Hÿva-Theme, es müssen keine besonderen Anforderungen erfüllt werden."
"Your site uses the Hÿva theme through package <strong>%1</strong>. To work properly with Hÿva, Elasticsuite requires the installation of additional <strong>compatibility modules (%2)</strong>.","Ihre Website verwendet das Hÿva-Theme über das Paket <strong>%1</strong>. Um ordnungsgemäß mit Hÿva zu funktionieren, erfordert Elasticsuite die Installation zusätzlicher <strong>Kompatibilitätsmodule (%2)</strong>."
"The compatibility modules <strong>%1 are missing</strong>. Please install them through composer.","Die Kompatibilitätsmodule <strong>%1 fehlen</strong>. Bitte installieren Sie sie über Composer."
"The compatibility module <strong>%1 is missing</strong>. Please install it through composer.","Das Kompatibilitätsmodul <strong>%1 fehlt</strong>. Bitte installieren Sie es über Composer."
8 changes: 8 additions & 0 deletions src/module-elasticsuite-core/i18n/en_US.csv
Original file line number Diff line number Diff line change
Expand Up @@ -153,3 +153,11 @@ Autocomplete,Autocomplete
"The maximum number of suggested search terms that will be used for fetching results in the products and categories autocomplete boxes. Having a value greater than the ""Max Size"" defined in the ""Popular Term Autocomplete"" section above has no effect.","The maximum number of suggested search terms that will be used for fetching results in the products and categories autocomplete boxes. Having a value greater than the ""Max Size"" defined in the ""Popular Term Autocomplete"" section above has no effect."
"No extension for actual popular search terms","No extension for actual popular search terms"
"Default: No. When set to ""Yes"", the extension mechanism will be discarded when the search term entered by the user is amongst the popular terms suggestions. Eg : When the user has finished typing ""computer"", if the list of suggested search terms is (""computer"", ""peach computer"", ""computer for kids""), only ""computer"" will be taken into account for the products and categories autocomplete.","Default: No. When set to ""Yes"", the extension mechanism will be discarded when the search term entered by the user is amongst the popular terms suggestions. Eg : When the user has finished typing ""computer"", if the list of suggested search terms is (""computer"", ""peach computer"", ""computer for kids""), only ""computer"" will be taken into account for the products and categories autocomplete."
"Some additional Elasticsuite packages are <strong>not in the same version</strong> as the Elasticsuite core package <strong>smile/elasticsuite</strong> which is in version <strong>%1</strong>.","Some additional Elasticsuite packages are <strong>not in the same version</strong> as the Elasticsuite core package <strong>smile/elasticsuite</strong> which is in version <strong>%1</strong>."
"You should <strong>update</strong> either the core or those additional <strong>Elasticsuite packages through composer</strong> so they share the exact same version.","You should <strong>update</strong> either the core or those additional <strong>Elasticsuite packages through composer</strong> so they share the exact same version."
"Those composer packages are: %1","Those composer packages are: %1"
"All the required Hÿva/Elasticsuite compatibility modules (%1) are correctly installed.","All the required Hÿva/Elasticsuite compatibility modules (%1) are correctly installed."
"Your site is not using the Hÿva theme, there are no specific requirements to fulfill.","Your site is not using the Hÿva theme, there are no specific requirements to fulfill."
"Your site uses the Hÿva theme through package <strong>%1</strong>. To work properly with Hÿva, Elasticsuite requires the installation of additional <strong>compatibility modules (%2)</strong>.","Your site uses the Hÿva theme through package <strong>%1</strong>. To work properly with Hÿva, Elasticsuite requires the installation of additional <strong>compatibility modules (%2)</strong>."
"The compatibility modules <strong>%1 are missing</strong>. Please install them through composer.","The compatibility modules <strong>%1 are missing</strong>. Please install them through composer."
"The compatibility module <strong>%1 is missing</strong>. Please install it through composer.","The compatibility module <strong>%1 is missing</strong>. Please install it through composer."
Loading

0 comments on commit 83df5fb

Please sign in to comment.