Files
2025-09-21 21:40:17 +07:00

173 lines
5.8 KiB
PHP

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
require __DIR__ . "/../config/connect.php"; // koneksi PDO
require __DIR__ . "/../config/gpt_ai.php"; // koneksi PDO
$action = $_GET['action'] ?? 'list';
$id_server = isset($_GET['i']) ? $_GET['i'] : 0;
if ($action === 'list') {
$limit = isset($_POST['length']) ? intval($_POST['length']) : 20;
$start = isset($_POST['start']) ? intval($_POST['start']) : 0;
// pecah id server jadi array aman
$ids = array_filter(array_map('intval', explode(',', $id_server)));
$placeholders = implode(',', array_fill(0, count($ids), '?'));
// hitung total data distinct topik
$stmt = $pdo->prepare("SELECT COUNT(DISTINCT topik)
FROM chat_topik
WHERE id_data_server IN ($placeholders)");
$stmt->execute($ids);
$totalData = $stmt->fetchColumn();
// ambil data unik berdasarkan topik (ambil id terbesar per topik)
$stmt = $pdo->prepare("
SELECT ct.id, ct.topik, ct.deskripsi
FROM chat_topik ct
INNER JOIN (
SELECT topik, MAX(id) AS max_id
FROM chat_topik
WHERE id_data_server IN ($placeholders)
GROUP BY topik
) tmax ON ct.id = tmax.max_id
ORDER BY ct.id DESC
LIMIT ?, ?
");
// binding ids dulu
$i = 1;
foreach ($ids as $id) {
$stmt->bindValue($i++, $id, PDO::PARAM_INT);
}
// binding limit
$stmt->bindValue($i++, $start, PDO::PARAM_INT);
$stmt->bindValue($i++, $limit, PDO::PARAM_INT);
$stmt->execute();
$data = [];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$data[] = [
$row['topik'],
$row['deskripsi'],
["id" => $row['id']]
];
}
echo json_encode([
"draw" => intval($_POST['draw'] ?? 1),
"recordsTotal" => intval($totalData),
"recordsFiltered" => intval($totalData),
"data" => $data
]);
exit;
}
if ($action === 'detail') {
$id = intval($_POST['id'] ?? 0);
$stmt = $pdo->prepare("SELECT id, deskripsi, topik FROM chat_topik WHERE id = ?");
$stmt->execute([$id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo json_encode($row ?: []);
exit;
}
if ($action === 'save') {
$id = intval($_POST['id'] ?? 0);
$deskripsi = trim($_POST['deskripsi'] ?? '');
$ids = array_filter(array_map('intval', explode(',', $_GET['i'] ?? '0')));
if ($deskripsi === '' || empty($ids)) {
echo json_encode(["status" => "error", "msg" => "Data tidak valid"]);
exit;
}
// buat metadata dari GPT
$payload = [
"model" => "gpt-3.5-turbo",
"messages" => [
["role" => "system", "content" => "Tolong rubah kalimat berikut menjadi metadata berbentuk JSON."],
["role" => "user", "content" => $deskripsi]
],
"temperature" => 0.0
];
$GPT = new Gpt_Ai_Api();
$metadata = $GPT->call_openai($payload);
// pastikan metadata berbentuk string JSON
if (is_array($metadata) || is_object($metadata)) {
$metadata = json_encode($metadata, JSON_UNESCAPED_UNICODE);
}
// pastikan metadata berbentuk string JSON
if (is_array($metadata) || is_object($metadata)) {
$metadata = json_encode($metadata, JSON_UNESCAPED_UNICODE);
}
if ($id > 0) {
// update data yang sudah ada
$stmt = $pdo->prepare("SELECT topik FROM chat_topik WHERE id = ?");
$stmt->execute([$id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row) {
$topik = $row['topik'];
if (count($ids) > 1) {
// multi server → replace ke semua id_data_server
$pdo->beginTransaction();
try {
$stmt = $pdo->prepare("
INSERT INTO chat_topik (id_data_server, topik, deskripsi, metadata)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE deskripsi = VALUES(deskripsi),
metadata = VALUES(metadata)
");
foreach ($ids as $sid) {
$stmt->execute([$sid, $topik, $deskripsi, $metadata]);
}
$pdo->commit();
echo json_encode(["status" => "ok"]);
} catch (Exception $e) {
$pdo->rollBack();
echo json_encode(["status" => "error", "msg" => $e->getMessage()]);
}
} else {
// single server → update biasa
$stmt = $pdo->prepare("UPDATE chat_topik SET deskripsi = ?, metadata = ? WHERE id = ?");
$ok = $stmt->execute([$deskripsi, $metadata, $id]);
echo json_encode(["status" => $ok ? "ok" : "error"]);
}
} else {
echo json_encode(["status" => "error", "msg" => "Topik tidak ditemukan"]);
}
} else {
// jika id = 0 → insert baru
try {
$pdo->beginTransaction();
$stmt = $pdo->prepare("
INSERT INTO chat_topik (id_data_server, topik, deskripsi, metadata)
VALUES (?, ?, ?, ?)
");
foreach ($ids as $sid) {
// topik bisa digenerate otomatis dari deskripsi (misalnya hash/md5)
$topik = substr(md5($deskripsi . $sid), 0, 16);
$stmt->execute([$sid, $topik, $deskripsi, $metadata]);
}
$pdo->commit();
echo json_encode(["status" => "ok"]);
} catch (Exception $e) {
$pdo->rollBack();
echo json_encode(["status" => "error", "msg" => $e->getMessage()]);
}
}
exit;
}
echo json_encode(["status" => "error", "msg" => "Action tidak valid"]);