false, 'error' => 'Authentication required']); exit; } // CSRF Protection require_once dirname(__DIR__) . '/middleware/CsrfMiddleware.php'; if ($_SERVER['REQUEST_METHOD'] === 'POST' || $_SERVER['REQUEST_METHOD'] === 'PUT') { $csrfToken = $_SERVER['HTTP_X_CSRF_TOKEN'] ?? ''; if (!CsrfMiddleware::validateToken($csrfToken)) { http_response_code(403); header('Content-Type: application/json'); echo json_encode([ 'success' => false, 'error' => 'Invalid CSRF token', 'csrf_token' => CsrfMiddleware::getToken() ]); exit; } $GLOBALS['newCsrfToken'] = CsrfMiddleware::rotateToken(); } $currentUser = $_SESSION['user']; $userId = $currentUser['user_id']; $isAdmin = $currentUser['is_admin'] ?? false; require_once dirname(__DIR__) . '/controllers/ApiTicketController.php'; // Use centralized database connection $conn = Database::getConnection(); // Check request method if ($_SERVER['REQUEST_METHOD'] !== 'POST') { throw new Exception("Method not allowed. Expected POST, got " . $_SERVER['REQUEST_METHOD']); } // Get POST data $input = file_get_contents('php://input'); $data = json_decode($input, true); if (!$data) { ob_end_clean(); http_response_code(400); header('Content-Type: application/json'); echo json_encode(['success' => false, 'error' => 'Invalid JSON data received']); exit; } if (!isset($data['ticket_id'])) { ob_end_clean(); http_response_code(400); header('Content-Type: application/json'); echo json_encode(['success' => false, 'error' => 'Missing ticket_id parameter']); exit; } $ticketId = trim((string)$data['ticket_id']); // Initialize controller $controller = new ApiTicketController($conn, $userId, $isAdmin, $currentUser); // Update ticket $result = $controller->update($ticketId, $data); // Discard any output that might have been generated ob_end_clean(); // Invalidate stats cache on successful ticket update if (!empty($result['success'])) { require_once dirname(__DIR__) . '/models/StatsModel.php'; (new StatsModel($conn))->invalidateCache(); } // Return response if (!empty($result['http_status'])) { http_response_code($result['http_status']); unset($result['http_status']); } header('Content-Type: application/json'); echo json_encode($result); } catch (Exception $e) { // Discard any output that might have been generated ob_end_clean(); // Log error details but don't expose to client error_log("Update ticket API error: " . $e->getMessage()); // Return error response header('Content-Type: application/json'); http_response_code(500); echo json_encode([ 'success' => false, 'error' => 'An internal error occurred' ]); }