173 lines
5.8 KiB
PHP
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"]);
|