getIdentity(); if (!$user->authorise('core.manage', 'com_plugins')) { $this->sendJson(403, ['error' => 'Not authorized']); return; } try { $service = $this->createService(); $this->sendJson(200, [ 'status' => 'ok', 'snapshots' => $service->listSnapshots(), ]); } catch (\Throwable $e) { $this->sendJson(500, [ 'error' => 'Failed to list snapshots', 'message' => $e->getMessage(), ]); } } /** * Create a new snapshot. * * @return void * * @since 02.21.00 */ public function execute($task = 'snapshot'): void { $app = Factory::getApplication(); if ($app->input->getMethod() !== 'POST') { $this->sendJson(405, ['error' => 'POST required']); return; } $user = $app->getIdentity(); if (!$user->authorise('core.manage', 'com_plugins')) { $this->sendJson(403, ['error' => 'Not authorized']); return; } try { $plugin = PluginHelper::getPlugin('system', 'mokosuiteclient'); $params = $plugin ? new Registry($plugin->params) : new Registry; $body = json_decode($app->input->json->getRaw(), true); $name = $body['name'] ?? $params->get('demo_active_baseline', 'default'); $service = $this->createService(); $result = $service->createSnapshot($name); $this->sendJson(200, $result); } catch (\Throwable $e) { $this->sendJson(500, [ 'error' => 'Snapshot failed', 'message' => $e->getMessage(), ]); } } /** * Create DemoResetService from plugin params. * * @return \Moko\Plugin\System\MokoSuiteClient\Service\DemoResetService * * @since 02.21.00 */ private function createService() { $serviceFile = JPATH_PLUGINS . '/task/mokosuiteclientdemo/src/Service/DemoResetService.php'; if (!file_exists($serviceFile)) { throw new \RuntimeException('DemoResetService not found — is the demo reset plugin installed?'); } require_once $serviceFile; $plugin = PluginHelper::getPlugin('system', 'mokosuiteclient'); $params = $plugin ? new Registry($plugin->params) : new Registry; $media = (bool) $params->get('demo_snapshot_include_media', 1); return new \Moko\Plugin\Task\MokoSuiteClientDemo\Service\DemoResetService($media); } /** * @param int $code HTTP status code * @param array $payload Response data * @return void */ private function sendJson(int $code, array $payload): void { $app = Factory::getApplication(); $app->setHeader('Content-Type', 'application/json', true); $app->setHeader('Status', (string) $code, true); echo json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); $app->close(); } }