34025-vm/api/chat.php
2025-09-11 22:08:13 +00:00

93 lines
3.1 KiB
PHP

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
session_start();
$logFile = __DIR__ . '/error.log';
// Clear the log file for each request to ensure we're only seeing the latest error.
file_put_contents($logFile, "");
// This is the top-level error handler.
// It will catch any exception that isn't caught elsewhere.
set_exception_handler(function($exception) use ($logFile) {
http_response_code(500);
$error = [
'error' => 'An unexpected error occurred.',
'message' => $exception->getMessage(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
];
file_put_contents($logFile, json_encode($error, JSON_PRETTY_PRINT));
// We must output valid JSON, otherwise the frontend will get a syntax error.
echo json_encode($error);
});
require_once __DIR__ . '/../lib/config.php';
require_once __DIR__ . '/../lib/OpenAIService.php';
require_once __DIR__ . '/../db/config.php';
// The main try-catch block for the application logic.
try {
// Check if it's a POST request
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405); // Method Not Allowed
throw new Exception('Only POST requests are allowed.');
}
// Get the user's message from the request body
$json_data = file_get_contents('php://input');
$data = json_decode($json_data);
$user_message = $data->message ?? '';
if (empty($user_message)) {
http_response_code(400); // Bad Request
throw new Exception('Message is required.');
}
// --- Database Interaction ---
$pdo = db();
if (empty($_SESSION['chat_session_id'])) {
$_SESSION['chat_session_id'] = bin2hex(random_bytes(16));
}
$chat_session_id = $_SESSION['chat_session_id'];
// Log the user's message
$stmt = $pdo->prepare("INSERT INTO chat_log (session_id, sender, message) VALUES (?, ?, ?)");
$stmt->execute([$chat_session_id, 'user', $user_message]);
// --- OpenAI API Call ---
$bot_response_data = OpenAIService::getCompletion($user_message);
if (isset($bot_response_data['error'])) {
throw new Exception('OpenAI API Error: ' . $bot_response_data['error']);
}
$bot_response = $bot_response_data['reply'];
// Log the bot's response
$stmt = $pdo->prepare("INSERT INTO chat_log (session_id, sender, message) VALUES (?, ?, ?)");
$stmt->execute([$chat_session_id, 'bot', $bot_response]);
// --- Send Response ---
header('Content-Type: application/json');
echo json_encode(['reply' => $bot_response]);
} catch (Throwable $e) {
// This will catch both Exceptions and Errors
http_response_code(500);
$errorDetails = [
'error' => 'Caught in main try-catch',
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString()
];
file_put_contents($logFile, date('Y-m-d H:i:s') . " - " . json_encode($errorDetails, JSON_PRETTY_PRINT) . "
", FILE_APPEND);
// Ensure a JSON response is sent on error
header('Content-Type: application/json');
echo json_encode($errorDetails);
}