false, 'message' => '', 'filename' => '']; // Create directory if not exists $targetPath = __DIR__ . '/../' . $targetDir; if (!is_dir($targetPath)) { mkdir($targetPath, 0755, true); } // Check upload error if ($file['error'] !== UPLOAD_ERR_OK) { $result['message'] = 'File upload error.'; return $result; } // Check if PDF $fileExt = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); if ($fileExt !== 'pdf') { $result['message'] = 'Only PDF files are allowed.'; return $result; } // Check file size (10MB max) if ($file['size'] > 10 * 1024 * 1024) { $result['message'] = 'File size must not exceed 10MB.'; return $result; } // Generate unique filename $newFileName = uniqid() . '.pdf'; $targetFile = $targetPath . '/' . $newFileName; // Move file if (move_uploaded_file($file['tmp_name'], $targetFile)) { $result['success'] = true; $result['filename'] = $newFileName; } else { $result['message'] = 'Failed to upload file.'; } return $result; } // Initialize $action = $_GET['action'] ?? 'list'; $id = (int)($_GET['id'] ?? 0); $success = $_GET['success'] ?? ''; $error = ''; try { $db = getDbConnection(); } catch (PDOException $e) { logError("Database connection error: " . $e->getMessage()); $error = "Database error: " . $e->getMessage(); $documents = []; } // Handle form submissions if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!verifyCSRF($_POST['csrf_token'] ?? '')) { $error = "Invalid CSRF token."; } elseif (isset($_POST['action'])) { $formAction = $_POST['action']; if ($formAction === 'add') { $title = sanitizeInput($_POST['title'] ?? ''); if (empty($title)) { $error = "Title is required."; } elseif (!isset($_FILES['pdf_file']) || $_FILES['pdf_file']['error'] !== UPLOAD_ERR_OK) { $error = "PDF file is required."; } else { try { $uploadResult = uploadPDF($_FILES['pdf_file'], 'img/documents'); if ($uploadResult['success']) { $stmt = $db->prepare("INSERT INTO documents (title, file_path, created_at) VALUES (?, ?, NOW())"); $stmt->execute([$title, 'img/documents/' . $uploadResult['filename']]); header("Location: documents.php?success=" . urlencode("Document added successfully.")); exit; } else { $error = $uploadResult['message']; } } catch (Exception $e) { $error = "Error: " . $e->getMessage(); } } } elseif ($formAction === 'delete') { $doc_id = (int)$_POST['doc_id']; try { // Get file path before deletion $stmt = $db->prepare("SELECT file_path FROM documents WHERE id = ?"); $stmt->execute([$doc_id]); $doc = $stmt->fetch(); if ($doc) { // Delete from database $stmt = $db->prepare("DELETE FROM documents WHERE id = ?"); $stmt->execute([$doc_id]); // Delete file $filePath = __DIR__ . '/../' . $doc['file_path']; if (file_exists($filePath)) { unlink($filePath); } header("Location: documents.php?success=" . urlencode("Document deleted successfully.")); exit; } } catch (Exception $e) { $error = "Error: " . $e->getMessage(); } } elseif ($formAction === 'toggle') { $doc_id = (int)$_POST['doc_id']; try { $stmt = $db->prepare("SELECT status FROM documents WHERE id = ?"); $stmt->execute([$doc_id]); $current = $stmt->fetch(); if ($current) { $newStatus = $current['status'] === 'active' ? 'inactive' : 'active'; $stmt = $db->prepare("UPDATE documents SET status = ? WHERE id = ?"); $stmt->execute([$newStatus, $doc_id]); header("Location: documents.php?success=" . urlencode("Status updated successfully.")); exit; } } catch (Exception $e) { $error = "Error: " . $e->getMessage(); } } } } // Get documents list try { $stmt = $db->prepare("SELECT * FROM documents ORDER BY created_at DESC"); $stmt->execute(); $documents = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { $error = "Database error: " . $e->getMessage(); $documents = []; } include 'includes/header.php'; ?>