* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @license GNU General Public License version 3 or later; see LICENSE */ namespace Joomla\Component\MokoBackup\Api\Controller; defined('_JEXEC') or die; use Joomla\CMS\MVC\Controller\ApiController; use Joomla\Component\MokoBackup\Administrator\Engine\BackupEngine; class BackupsController extends ApiController { protected $contentType = 'backups'; protected $default_view = 'backups'; /** * Start a new backup (POST /api/index.php/v1/mokobackup/backup) */ public function backup(): static { $data = json_decode($this->input->json->getRaw(), true) ?: []; $profileId = (int) ($data['profile'] ?? 1); $description = $data['description'] ?? 'API backup ' . date('Y-m-d H:i:s'); $engine = new BackupEngine(); $result = $engine->run($profileId, $description, 'api'); if ($result['success']) { $this->app->setHeader('status', 200); echo json_encode(['data' => $result]); } else { $this->app->setHeader('status', 500); echo json_encode(['errors' => [['title' => $result['message']]]]); } $this->app->close(); return $this; } /** * Download a backup archive (GET /api/index.php/v1/mokobackup/backup/:id/download) */ public function download(): static { $id = $this->input->getInt('id', 0); $model = $this->getModel('Backup', 'Administrator'); $item = $model->getItem($id); if (!$item || !$item->id || !$item->filesexist || !is_file($item->absolute_path)) { $this->app->setHeader('status', 404); echo json_encode(['errors' => [['title' => 'Backup file not found']]]); $this->app->close(); return $this; } $content = base64_encode(file_get_contents($item->absolute_path)); $this->app->setHeader('status', 200); echo json_encode(['data' => $content]); $this->app->close(); return $this; } /** * List backup profiles (GET /api/index.php/v1/mokobackup/profiles) */ public function profiles(): static { $model = $this->getModel('Profiles', 'Administrator'); $items = $model->getItems(); $data = []; foreach ($items as $item) { $data[] = [ 'type' => 'profiles', 'id' => $item->id, 'attributes' => $item, ]; } $this->app->setHeader('status', 200); echo json_encode(['data' => $data]); $this->app->close(); return $this; } }