Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
93 lines
3.3 KiB
PHP
93 lines
3.3 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace LIT\MCP\Integrations\Divi\Release;
|
||
|
||
use Closure;
|
||
use LIT\MCP\Integrations\Divi\Schema\DiviModules;
|
||
use LIT\MCP\Integrations\Divi\Schema\ShortformCheck;
|
||
use LIT\MCP\Integrations\WordPress\Content\ContentComposer;
|
||
use LIT\MCP\Plugin;
|
||
use Throwable;
|
||
|
||
defined('ABSPATH') || exit;
|
||
|
||
/**
|
||
* The admin check (spec §6.2) – also wp lit-mcp divi-check: manifests (code and registrations), fingerprints,
|
||
* module catalog, format round trip and the write test. A step that throws is a red step; the write test is skipped
|
||
* only when Divi functions are missing (it would fail anyway), not when only fingerprints changed – so
|
||
* --update-reference can see whether everything else still works. Not final so the route and the command can be
|
||
* tested with a mock.
|
||
*/
|
||
class CompatibilityCheck
|
||
{
|
||
/**
|
||
* @param Closure(): list<string> $catalog Short-form problems against Divi's live catalog.
|
||
* @param Closure(): string $version Installed Divi version ('' = unknown).
|
||
* @param Closure(string): string $stateKey ReleaseResolver::stateKey().
|
||
*/
|
||
public function __construct(
|
||
private ManifestCheck $manifests,
|
||
private Closure $catalog,
|
||
private FormatCheck $format,
|
||
private WriteProbe $probe,
|
||
private Closure $version,
|
||
private Closure $stateKey
|
||
) {
|
||
}
|
||
|
||
public static function create(ContentComposer $composer): self
|
||
{
|
||
return new self(
|
||
new ManifestCheck(),
|
||
static fn (): array => DiviModules::isAvailable()
|
||
? ShortformCheck::problems((new DiviModules())->catalog())
|
||
: ['Divi 5 ist in dieser Anfrage nicht geladen.'],
|
||
new FormatCheck(),
|
||
new WriteProbe($composer),
|
||
static fn (): string => DiviEnvironment::version() ?? '',
|
||
static fn (string $version): string => ReleaseResolver::stateKey($version)
|
||
);
|
||
}
|
||
|
||
public function run(int $userId): CheckReport
|
||
{
|
||
$manifest = self::guarded(fn (): array => ManifestCheck::failed(
|
||
array_merge($this->manifests->codeChecks(), $this->manifests->registrationChecks())
|
||
));
|
||
$steps = [
|
||
new CheckStep(CheckStep::MANIFEST, $manifest),
|
||
new CheckStep(CheckStep::MIRRORS, self::guarded(
|
||
fn (): array => ManifestCheck::failed($this->manifests->mirrorChecks())
|
||
)),
|
||
new CheckStep(CheckStep::CATALOG, self::guarded($this->catalog)),
|
||
new CheckStep(CheckStep::FORMAT, self::guarded(fn (): array => $this->format->problems())),
|
||
$manifest === []
|
||
? new CheckStep(CheckStep::WRITE, self::guarded(fn (): array => $this->probe->run()))
|
||
: new CheckStep(CheckStep::WRITE, [], true),
|
||
];
|
||
$version = ($this->version)();
|
||
|
||
return new CheckReport(
|
||
wp_generate_uuid4(),
|
||
gmdate('c'),
|
||
$userId,
|
||
$version,
|
||
Plugin::VERSION,
|
||
($this->stateKey)($version),
|
||
$steps
|
||
);
|
||
}
|
||
|
||
/** @return list<string> */
|
||
private static function guarded(Closure $step): array
|
||
{
|
||
try {
|
||
return array_values(array_filter((array) $step(), 'is_string'));
|
||
} catch (Throwable $e) {
|
||
return ['Prüfschritt abgebrochen: ' . $e->getMessage()];
|
||
}
|
||
}
|
||
}
|