{"folders": [{"id": "...", "name": "...", "icon": "...", "containers": ["name", ...]}, ...]} * save POST {"folders": [...]} -> persists the whole list (same * whole-list-replace pattern settings.php's autostart_save uses * — the frontend already holds the full, current structure in * memory after any add/rename/reassign, so there's no need for * narrower per-folder mutation endpoints) */ declare(strict_types=1); require __DIR__ . '/../include/bootstrap.php'; $action = $_GET['action'] ?? ''; switch ($action) { case 'list': podman_json_response(['folders' => folders_read($podmanConfig)]); break; case 'save': $body = podman_read_json_body(); podman_json_response(['folders' => folders_save($podmanConfig, is_array($body['folders'] ?? null) ? $body['folders'] : [])]); break; default: podman_json_error("Unknown action '{$action}'", 400); } /** @return array> */ function folders_read(PodmanConfig $config): array { if (!is_readable($config->foldersFile)) { return []; } $decoded = json_decode((string) file_get_contents($config->foldersFile), true); return is_array($decoded) ? $decoded : []; } /** * Re-validates and normalizes before writing — a folder with no name (or * whose name became empty through some client-side bug) is silently * dropped rather than persisted as junk that would then need cleaning up * by hand in the JSON file directly. * * @param array $folders * @return array> the normalized list actually written */ function folders_save(PodmanConfig $config, array $folders): array { $clean = []; foreach ($folders as $f) { if (!is_array($f)) { continue; } $name = trim((string) ($f['name'] ?? '')); if ($name === '') { continue; } $containers = []; foreach (($f['containers'] ?? []) as $n) { $n = trim((string) $n); if ($n !== '') { $containers[] = $n; } } $clean[] = [ 'id' => (string) ($f['id'] ?? '') !== '' ? (string) $f['id'] : bin2hex(random_bytes(6)), 'name' => $name, 'icon' => trim((string) ($f['icon'] ?? '')), 'containers' => $containers, ]; } if (file_put_contents($config->foldersFile, json_encode($clean, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES), LOCK_EX) === false) { podman_json_error("Could not write {$config->foldersFile}", 500); } return $clean; }