'Non identifié — veuillez vous connecter.']); exit; } const RACINE_BROUILLONS_SW = '/var/www/sites_brouillons'; const RACINE_PUBLIEES_SW = __DIR__ . '/sites_publies'; try { $pdo = getDbConnection(); } catch (PDOException $e) { http_response_code(500); echo json_encode(['error' => 'Connexion base de données impossible']); exit; } function supprimerDossierRecursif(string $dossier): void { if (!is_dir($dossier)) return; $elements = array_diff(scandir($dossier), ['.', '..']); foreach ($elements as $element) { $chemin = $dossier . '/' . $element; is_dir($chemin) ? supprimerDossierRecursif($chemin) : @unlink($chemin); } @rmdir($dossier); } $method = $_SERVER['REQUEST_METHOD']; if ($method === 'GET') { $sites = $pdo->query('SELECT * FROM ASP_SitesWeb ORDER BY SIT_DateCreation DESC')->fetchAll(); foreach ($sites as &$s) { $stmt = $pdo->prepare('SELECT SWF_CheminRelatif, SWF_Taille, SWF_DateModification FROM ASP_SitesWebFichiers WHERE SWF_SiteIncr = ? ORDER BY SWF_CheminRelatif'); $stmt->execute([$s['SIT_Incr']]); $s['fichiers'] = $stmt->fetchAll(); } echo json_encode(['sites' => $sites]); exit; } if ($method === 'POST') { $data = json_decode(file_get_contents('php://input'), true) ?? []; $action = (string) ($data['action'] ?? ''); $sitIncr = (int) ($data['SIT_Incr'] ?? 0); if ($action !== 'publier') { http_response_code(400); echo json_encode(['error' => 'Action inconnue (seule "publier" est supportée)']); exit; } if ($sitIncr <= 0) { http_response_code(400); echo json_encode(['error' => 'SIT_Incr manquant ou invalide']); exit; } $stmt = $pdo->prepare('SELECT * FROM ASP_SitesWeb WHERE SIT_Incr = ?'); $stmt->execute([$sitIncr]); $site = $stmt->fetch(); if (!$site) { http_response_code(404); echo json_encode(['error' => 'Site introuvable']); exit; } $stmt = $pdo->prepare('SELECT SWF_CheminRelatif FROM ASP_SitesWebFichiers WHERE SWF_SiteIncr = ?'); $stmt->execute([$sitIncr]); $fichiers = $stmt->fetchAll(PDO::FETCH_COLUMN); if (!$fichiers) { http_response_code(400); echo json_encode(['error' => 'Ce site ne contient encore aucun fichier — rien à publier.']); exit; } $dossierBrouillon = RACINE_BROUILLONS_SW . '/' . $site['SIT_CheminDossier']; $dossierPublie = RACINE_PUBLIEES_SW . '/' . $site['SIT_CheminDossier']; supprimerDossierRecursif($dossierPublie); @mkdir($dossierPublie, 0777, true); @chmod($dossierPublie, 0777); foreach ($fichiers as $relatif) { $source = realpath($dossierBrouillon . '/' . $relatif); $racineBrouillonReelle = realpath($dossierBrouillon); if ($source === false || $racineBrouillonReelle === false || !str_starts_with($source, $racineBrouillonReelle)) { continue; // fichier référencé en base mais absent/anormal sur disque — ignoré, jamais bloquant pour les autres } $destination = $dossierPublie . '/' . $relatif; @mkdir(dirname($destination), 0777, true); @chmod(dirname($destination), 0777); copy($source, $destination); @chmod($destination, 0666); } $pdo->prepare("UPDATE ASP_SitesWeb SET SIT_Statut = 'publie', SIT_DatePublication = NOW() WHERE SIT_Incr = ?") ->execute([$sitIncr]); echo json_encode(['success' => true, 'chemin_publie' => 'sites_publies/' . $site['SIT_CheminDossier']]); exit; } http_response_code(405); echo json_encode(['error' => 'Méthode non autorisée']);