false, 'message' => 'Not authenticated']); } // Check method if ($_SERVER['REQUEST_METHOD'] !== 'POST') { sendJson(['success' => false, 'message' => 'Invalid request method']); } // Get parameters $itemType = $_POST['item_type'] ?? ''; $itemId = intval($_POST['item_id'] ?? 0); if (empty($itemType) || $itemId <= 0) { sendJson(['success' => false, 'message' => 'Invalid parameters']); } // Check if user has edit permission if (!canEdit($itemType, $itemId)) { sendJson(['success' => false, 'message' => 'You do not have permission to edit this item']); } // Validate item type $validTypes = ['map', 'dashboard', 'document', 'html_page']; if (!in_array($itemType, $validTypes)) { sendJson(['success' => false, 'message' => 'Invalid item type']); } // Check file upload if (!isset($_FILES['thumbnail']) || $_FILES['thumbnail']['error'] !== UPLOAD_ERR_OK) { sendJson(['success' => false, 'message' => 'No file uploaded or upload error']); } // Validate file type - use extension like documents.php does $file = $_FILES['thumbnail']; $originalFilename = basename($file['name']); $extension = strtolower(pathinfo($originalFilename, PATHINFO_EXTENSION)); $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp']; if (!in_array($extension, $allowedExtensions)) { sendJson(['success' => false, 'message' => 'Invalid file type. Only JPG, PNG, GIF, and WebP images are allowed.']); } // Validate file size (max 5MB) $maxSize = 5 * 1024 * 1024; if ($file['size'] > $maxSize) { sendJson(['success' => false, 'message' => 'File too large. Maximum size is 5MB.']); } // Create thumbnails directory $uploadDir = 'assets/thumbnails'; // Generate unique filename $filename = $itemType . '_' . $itemId . '_' . uniqid() . '.' . $extension; $uploadPath = $uploadDir . '/' . $filename; // Move uploaded file if (!move_uploaded_file($file['tmp_name'], $uploadPath)) { sendJson(['success' => false, 'message' => 'Failed to save file']); } // Update database $relativePath = 'assets/thumbnails/' . $filename; try { switch ($itemType) { case 'map': updateMapThumbnail($itemId, $relativePath); break; case 'dashboard': updateDashboardThumbnail($itemId, $relativePath); break; case 'document': updateDocumentThumbnail($itemId, $relativePath); break; case 'html_page': updateHtmlPageThumbnail($itemId, $relativePath); break; } sendJson([ 'success' => true, 'message' => 'Thumbnail uploaded successfully', 'thumbnail_path' => $relativePath ]); } catch (Exception $e) { // Delete uploaded file if database fails if (file_exists($uploadPath)) { unlink($uploadPath); } sendJson([ 'success' => false, 'message' => 'Failed to update database: ' . $e->getMessage() ]); }