247 lines
8.3 KiB
PHP
247 lines
8.3 KiB
PHP
<?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
|
|
);
|
|
}
|
|
} |