Update Banyak
This commit is contained in:
@@ -0,0 +1,247 @@
|
||||
<?php
|
||||
// include_once __DIR__ . "/../../config/connect.php";
|
||||
|
||||
class ResponAI_Helper {
|
||||
|
||||
private $pdo;
|
||||
|
||||
// Terima objek PDO di konstruktor
|
||||
public function __construct(PDO $pdo) {
|
||||
$this->pdo = $pdo;
|
||||
}
|
||||
|
||||
public function db_connect() {
|
||||
// Tidak perlu lagi global $pdo;
|
||||
return $this->pdo;
|
||||
}
|
||||
|
||||
public function cek_role($sender) {
|
||||
// Cek di pelanggan
|
||||
$SQLPel = "SELECT
|
||||
id AS id_pelanggan_db,
|
||||
nama AS nama,
|
||||
jenis_layanan AS jenis_layanan,
|
||||
email AS email,
|
||||
nik AS nik,
|
||||
`status` AS status_pelanggan,
|
||||
time_start AS mulai_berlangganan,
|
||||
alamat AS alamat,
|
||||
nomor_whatsapp AS nomor_whatsapp,
|
||||
desa AS desa,
|
||||
CONCAT(latitude, ', ', longitude) AS titik_koordinat,
|
||||
akun AS akun,
|
||||
akun AS id_pelanggan,
|
||||
user_hotspot AS user_hotspot,
|
||||
ip_address AS ip_address,
|
||||
status_koneksi AS status_koneksi,
|
||||
nama_server AS nama_server,
|
||||
nama_paket AS paket_berlanggan,
|
||||
nama_topologi AS nama_odp,
|
||||
port_odp AS port_odp,
|
||||
nama_marketing AS nama_sales
|
||||
FROM v_pelanggan
|
||||
WHERE nomor_whatsapp = ? ";
|
||||
|
||||
$stmt1 = $this->pdo->prepare($SQLPel);
|
||||
$stmt1->execute([$sender]);
|
||||
$pelanggan = $stmt1->fetch(PDO::FETCH_ASSOC);
|
||||
if ($pelanggan) {
|
||||
return [
|
||||
"role" => "pelanggan",
|
||||
"data" => $pelanggan
|
||||
];
|
||||
}
|
||||
|
||||
// Cek di user akses
|
||||
$stmt2 = $this->pdo->prepare("SELECT * FROM user_akses WHERE nomor_whatsapp = ?");
|
||||
$stmt2->execute([$sender]);
|
||||
$karyawan = $stmt2->fetch(PDO::FETCH_ASSOC);
|
||||
if ($karyawan) {
|
||||
return [
|
||||
"role" => "karyawan",
|
||||
"data" => $karyawan
|
||||
];
|
||||
}
|
||||
|
||||
// Cek di data_server
|
||||
$SQLOwner = "SELECT
|
||||
id AS id,
|
||||
nama_server AS nama_server,
|
||||
nama_pemilik AS nama_pemilik,
|
||||
alamat AS alamat,
|
||||
expaired_date AS tanggal_expired_aplikasi,
|
||||
whatsapp AS nomor_whatsapp,
|
||||
username AS username,
|
||||
harga_sewa AS harga_sewa,
|
||||
email AS email,
|
||||
rekening_nomor AS nomor_rekening,
|
||||
rekening_bank AS bank_rekening,
|
||||
rekening_status AS status_rekening
|
||||
FROM data_server WHERE whatsapp = ?";
|
||||
|
||||
$stmt3 = $this->pdo->prepare($SQLOwner);
|
||||
$stmt3->execute([$sender]);
|
||||
$owner = $stmt3->fetch(PDO::FETCH_ASSOC);
|
||||
if ($owner) {
|
||||
return [
|
||||
"role" => "owner",
|
||||
"data" => $owner
|
||||
];
|
||||
}
|
||||
|
||||
// Default
|
||||
return [
|
||||
"role" => "umum",
|
||||
"data" => null
|
||||
];
|
||||
}
|
||||
|
||||
public function get_id_server($apikey) {
|
||||
$stmt = $this->pdo->prepare("SELECT id FROM data_server WHERE apikey_whatsapp = ?");
|
||||
$stmt->execute([$apikey]);
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_COLUMN);
|
||||
|
||||
if (!$rows) {
|
||||
return ''; // tidak ada hasil, biar aman tetap string kosong
|
||||
}
|
||||
|
||||
// Kalau ada id = 78, override pakai daftar fixed
|
||||
if (in_array(78, $rows)) {
|
||||
return "3,2,4,5,6,8,9,67,74,75,76";
|
||||
}
|
||||
|
||||
// Balikin id dalam format '1,2,3'
|
||||
return implode(',', $rows);
|
||||
}
|
||||
|
||||
// ambil data static sesuai roll akses
|
||||
public function get_data_statis($staticQuery) {
|
||||
$staticResult = [];
|
||||
|
||||
foreach ($staticQuery as $q) {
|
||||
// Pastikan query hanya SELECT
|
||||
if (stripos(trim($q), 'SELECT') !== 0) {
|
||||
throw new Exception("Hanya query SELECT yang diperbolehkan.");
|
||||
}
|
||||
|
||||
$stmt = $this->pdo->prepare($q);
|
||||
$stmt->execute();
|
||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// Gabungkan hasil setiap query
|
||||
$staticResult[] = [
|
||||
"query" => $q,
|
||||
"rows" => $rows
|
||||
];
|
||||
}
|
||||
|
||||
return $staticResult;
|
||||
}
|
||||
|
||||
public function process_db_action($jsonAI, array $allowedColumns, $idServers) {
|
||||
// Bisa single query (object) atau multi query (array)
|
||||
$queries = isset($jsonAI[0]) ? $jsonAI : [$jsonAI];
|
||||
$results = [];
|
||||
|
||||
foreach ($queries as $q) {
|
||||
$action = strtoupper($q['action'] ?? '');
|
||||
$table = $q['table'] ?? '';
|
||||
$columns_to_select = $q['columns'] ?? []; // Tambahkan ini untuk mengambil kolom yang diminta
|
||||
|
||||
if (!$action || !$table) {
|
||||
$results[] = ["error" => "Instruksi tidak lengkap"];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!array_key_exists($table, $allowedColumns)) {
|
||||
$results[] = ["error" => "Tabel tidak valid"];
|
||||
continue;
|
||||
}
|
||||
|
||||
// Validasi kolom yang diminta
|
||||
$valid_columns = [];
|
||||
if (!empty($columns_to_select)) {
|
||||
foreach ($columns_to_select as $col) {
|
||||
if (in_array($col, $allowedColumns[$table])) {
|
||||
$valid_columns[] = $col;
|
||||
}
|
||||
}
|
||||
if (empty($valid_columns)) {
|
||||
$results[] = ["error" => "Tidak ada kolom yang valid diminta untuk tabel $table"];
|
||||
continue;
|
||||
}
|
||||
$select_clause = implode(", ", $valid_columns);
|
||||
} else {
|
||||
// Jika tidak ada kolom spesifik diminta, default ke semua kolom yang diizinkan
|
||||
$select_clause = implode(", ", $allowedColumns[$table]);
|
||||
}
|
||||
|
||||
|
||||
// WHERE filtering
|
||||
$where = $q['where'] ?? [];
|
||||
$clauses = [];
|
||||
$params = [];
|
||||
|
||||
foreach ($where as $col => $val) {
|
||||
if (!in_array($col, $allowedColumns[$table])) {
|
||||
// Log atau abaikan kolom yang tidak diizinkan dalam klausa WHERE
|
||||
// Untuk keamanan, kita abaikan saja
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_array($val) && isset($val['LIKE'])) {
|
||||
// format: {"col":{"LIKE":"202508%"}}
|
||||
$clauses[] = "$col LIKE ?";
|
||||
$params[] = $val['LIKE'];
|
||||
} else {
|
||||
// default: {"col":"value"}
|
||||
$clauses[] = "$col = ?";
|
||||
$params[] = $val;
|
||||
}
|
||||
}
|
||||
|
||||
$whereSQL = $clauses ? "WHERE " . implode(" AND ", $clauses) : "";
|
||||
$wherestatis = $whereSQL ? " AND id_data_server IN ($idServers)"
|
||||
: "WHERE id_data_server IN ($idServers)";
|
||||
|
||||
if ($action === "COUNT") {
|
||||
$sql = "SELECT COUNT(id) as total FROM $table $whereSQL $wherestatis";
|
||||
$stmt = $this->pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$result = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$this->log_query($sql, $params, $result);
|
||||
$results[] = $result;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($action === "GET") {
|
||||
// Gunakan $select_clause yang sudah divalidasi
|
||||
if ($table == 'profile_paket') {
|
||||
$sql = "SELECT $select_clause FROM $table $whereSQL $wherestatis GROUP BY nama, nama_profile";
|
||||
} else {
|
||||
$sql = "SELECT $select_clause FROM $table $whereSQL $wherestatis LIMIT 10";
|
||||
}
|
||||
$stmt = $this->pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$this->log_query($sql, $params, $result);
|
||||
$results[] = $result;
|
||||
continue;
|
||||
}
|
||||
|
||||
$results[] = ["error" => "Aksi tidak diizinkan"];
|
||||
}
|
||||
|
||||
// Kalau hanya 1 query, return langsung
|
||||
return count($results) === 1 ? $results[0] : $results;
|
||||
}
|
||||
|
||||
private function log_query($sql, $params, $result) {
|
||||
file_put_contents(
|
||||
__DIR__ . "/api_request.log",
|
||||
"[" . date('Y-m-d H:i:s') . "] SQL: $sql\nPARAMS: " . json_encode($params) .
|
||||
"\nRESULT: " . json_encode($result, JSON_PRETTY_PRINT) . "\n-----------------------------\n",
|
||||
FILE_APPEND
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user