'Bad Request', 'message' => 'Missing required fields: product_slug, version, download_url'], 400); } $ok = $updateMgr->addRelease($product, $version, $channel, $notes, $url, $hash, $gitCommit, $sizeBytes, null, $isCritical); if ($ok) { sendResponse(['status' => 'success', 'message' => "Release v{$version} published for {$product} ({$channel})."]); } else { sendResponse(['error' => 'Database Error', 'message' => 'Failed to store release.'], 500); } } if (str_ends_with($uri, '/check') && ($method === 'GET' || $method === 'POST')) { $product = $_REQUEST['product'] ?? $_REQUEST['product_slug'] ?? ''; $version = $_REQUEST['version'] ?? $_REQUEST['current_version'] ?? '0.0.0'; $channel = $_REQUEST['channel'] ?? 'prod'; if (empty($product)) { sendResponse(['error' => 'Bad Request', 'message' => 'Parameter "product" is required.'], 400); } $latest = $updateMgr->checkUpdate($product, $version, $channel); if ($latest) { sendResponse([ 'update_available' => true, 'latest_release' => $latest ]); } else { sendResponse([ 'update_available' => false, 'message' => 'Application is up to date.' ]); } } if (str_ends_with($uri, '/releases') && $method === 'GET') { $product = $_GET['product'] ?? null; $channel = $_GET['channel'] ?? null; $releases = $updateMgr->getReleases($product, $channel); sendResponse(['count' => count($releases), 'releases' => $releases]); } sendResponse(['error' => 'Not Found', 'message' => 'Endpoint not found'], 404); } catch (Throwable $t) { sendResponse(['error' => 'Server Error', 'message' => $t->getMessage()], 500); }