Update Banyak
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
<?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"]);
|
||||
Reference in New Issue
Block a user