Files
VITEC-website/packages/vitec/Classes/Command/SsrPurgeCommand.php
T
orascheandClaude Fable 5 63f950f9db SSR control center: auto-purge webhook, dashboard tiles, backend module
Package 1: SsrPurgeService posts to the node /__purge (endpoint+secret in var/vitec-ssr-purge.env, outside git) and logs every attempt to tx_vitec_ssrpurgelog. DataHandler hooks queue per request and flush once: pages with nav-relevant field changes and all tx_news_/tx_vitec_ records purge everything, other page/content edits purge the hosting page path. Gated by the routing flag and the new Site Set switch vitec.ssr.autoPurge. Flipping the SSR switch ON purges everything once. CLI: vitec:ssr-purge, vitec:ssr-health (samples /__health into tx_vitec_ssrhealthlog, 14 days kept, scheduler-ready). Package 2: dashboard widgets vitecSsrStatus (live health, release, switch, last purge) and vitecSsrStats (purge counts, failures, uptime, response time). Package 3: backend module web_vitecssr with manual purge (paths or everything) and both protocols. Tested end to end against the running node (purge single/all 200, health sample logged).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-11-09 20:46:16 +01:00

50 lines
1.7 KiB
PHP

<?php
declare(strict_types=1);
namespace Evomedien\Vitec\Command;
use Evomedien\Vitec\Service\SsrPurgeService;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
#[AsCommand(
name: 'vitec:ssr-purge',
description: 'Purge paths (or everything with --all) from the SSR node page cache',
)]
final class SsrPurgeCommand extends Command
{
public function __construct(private readonly SsrPurgeService $purgeService)
{
parent::__construct();
}
protected function configure(): void
{
$this->addArgument('paths', InputArgument::IS_ARRAY, 'Paths to purge, e.g. /products/aligo');
$this->addOption('all', null, InputOption::VALUE_NONE, 'Purge the whole cache ("*")');
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$paths = $input->getOption('all') ? ['*'] : (array)$input->getArgument('paths');
if ($paths === []) {
$output->writeln('<error>No paths given (use arguments or --all).</error>');
return Command::INVALID;
}
$result = $this->purgeService->purge($paths, 'cli');
$output->writeln(sprintf(
'%s HTTP %d - %s (paths: %s)',
$result['success'] ? '<info>OK</info>' : '<error>FAILED</error>',
$result['httpCode'],
$result['message'],
implode(', ', $result['paths'])
));
return $result['success'] ? Command::SUCCESS : Command::FAILURE;
}
}