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"]);