401 lines
16 KiB
PHP
401 lines
16 KiB
PHP
<?php
|
|
require_once 'auth.php';
|
|
requireApiLogin();
|
|
// api.php — WebGIS Pemetaan Penduduk Miskin
|
|
header("Content-Type: application/json");
|
|
header("Access-Control-Allow-Origin: *");
|
|
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
|
|
header("Access-Control-Allow-Headers: Content-Type");
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit(); }
|
|
|
|
// ── KONFIGURASI ──────────────────────────────────────────────
|
|
$host = "tocg40440408gocww0c8osgc";
|
|
$dbname = "default";
|
|
$username = "mysql";
|
|
$password = "sjQiQ0OnycL1bhCEzywCfN41cWHGFmBzQXiEr0P3RiMrFlq3pvI2lowKRDDmOhAN";
|
|
|
|
try {
|
|
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
|
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
|
|
} catch (PDOException $e) {
|
|
http_response_code(500);
|
|
echo json_encode(["success" => false, "message" => "Koneksi gagal: " . $e->getMessage()]);
|
|
exit();
|
|
}
|
|
|
|
$method = $_SERVER['REQUEST_METHOD'];
|
|
$input = json_decode(file_get_contents("php://input"), true) ?? [];
|
|
$resource = strtolower($_GET['resource'] ?? '');
|
|
|
|
switch ($resource) {
|
|
case 'ibadah': handleIbadah($pdo, $method, $input); break;
|
|
case 'miskin': handleMiskin($pdo, $method, $input); break;
|
|
case 'bantuan': handleBantuan($pdo, $method, $input); break;
|
|
default:
|
|
http_response_code(404);
|
|
echo json_encode(["success" => false, "message" => "Resource '$resource' tidak ditemukan. Gunakan: ibadah, miskin, bantuan"]);
|
|
}
|
|
|
|
// ════════════════════════════════════════════════════════════════
|
|
// RUMAH IBADAH
|
|
// ════════════════════════════════════════════════════════════════
|
|
function handleIbadah($pdo, $method, $input) {
|
|
$validKategori = ['Masjid', 'Gereja', 'Gereja Katolik', 'Pura', 'Vihara', 'Klenteng'];
|
|
|
|
switch ($method) {
|
|
case 'GET':
|
|
try {
|
|
$s = $pdo->query("SELECT * FROM rumah_ibadah ORDER BY kategori, nama_ibadah ASC");
|
|
echo json_encode(["success" => true, "data" => $s->fetchAll()]);
|
|
} catch (Exception $e) {
|
|
echo json_encode(["success" => true, "data" => [], "warning" => "Tabel belum ada: " . $e->getMessage()]);
|
|
}
|
|
break;
|
|
|
|
case 'POST':
|
|
if (isOperator()) {
|
|
http_response_code(403);
|
|
echo json_encode([
|
|
"success" => false,
|
|
"message" => "Operator tidak punya akses ini"
|
|
]);
|
|
return;
|
|
}
|
|
|
|
foreach (['nama_ibadah', 'kategori', 'latitude', 'longitude', 'radius_meter'] as $f) {
|
|
if (!isset($input[$f]) || $input[$f] === '') {
|
|
http_response_code(400);
|
|
echo json_encode(["success" => false, "message" => "Field '$f' wajib diisi"]);
|
|
return;
|
|
}
|
|
}
|
|
if (!in_array($input['kategori'], $validKategori)) {
|
|
http_response_code(400);
|
|
echo json_encode(["success" => false, "message" => "Kategori tidak valid. Pilih: " . implode(', ', $validKategori)]);
|
|
return;
|
|
}
|
|
$s = $pdo->prepare(
|
|
"INSERT INTO rumah_ibadah (nama_ibadah, kategori, radius_meter, keterangan, alamat, latitude, longitude)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?)"
|
|
);
|
|
$s->execute([
|
|
trim($input['nama_ibadah']),
|
|
$input['kategori'],
|
|
(int)$input['radius_meter'],
|
|
trim($input['keterangan'] ?? ''),
|
|
trim($input['alamat'] ?? ''),
|
|
(float)$input['latitude'],
|
|
(float)$input['longitude'],
|
|
]);
|
|
echo json_encode(["success" => true, "message" => "Rumah ibadah disimpan", "id" => $pdo->lastInsertId()]);
|
|
break;
|
|
|
|
case 'PUT':
|
|
if (isOperator()) {
|
|
http_response_code(403);
|
|
echo json_encode([
|
|
"success" => false,
|
|
"message" => "Operator tidak punya akses ini"
|
|
]);
|
|
return;
|
|
}
|
|
if (!isset($input['id'])) {
|
|
http_response_code(400); echo json_encode(["success" => false, "message" => "ID diperlukan"]); return;
|
|
}
|
|
if (!in_array($input['kategori'], $validKategori)) {
|
|
http_response_code(400);
|
|
echo json_encode(["success" => false, "message" => "Kategori tidak valid"]);
|
|
return;
|
|
}
|
|
$s = $pdo->prepare(
|
|
"UPDATE rumah_ibadah SET nama_ibadah=?, kategori=?, radius_meter=?, keterangan=?, alamat=?, latitude=?, longitude=?
|
|
WHERE id=?"
|
|
);
|
|
$s->execute([
|
|
trim($input['nama_ibadah']),
|
|
$input['kategori'],
|
|
(int)$input['radius_meter'],
|
|
trim($input['keterangan'] ?? ''),
|
|
trim($input['alamat'] ?? ''),
|
|
(float)$input['latitude'],
|
|
(float)$input['longitude'],
|
|
(int)$input['id'],
|
|
]);
|
|
echo json_encode(["success" => true, "message" => "Rumah ibadah diperbarui"]);
|
|
break;
|
|
|
|
case 'DELETE':
|
|
if (isOperator()) {
|
|
http_response_code(403);
|
|
echo json_encode([
|
|
"success" => false,
|
|
"message" => "Operator tidak punya akses ini"
|
|
]);
|
|
return;
|
|
}
|
|
|
|
$id = $_GET['id'] ?? $input['id'] ?? null;
|
|
if (!$id) { http_response_code(400); echo json_encode(["success" => false, "message" => "ID diperlukan"]); return; }
|
|
$pdo->prepare("DELETE FROM rumah_ibadah WHERE id=?")->execute([(int)$id]);
|
|
echo json_encode(["success" => true, "message" => "Rumah ibadah dihapus"]);
|
|
break;
|
|
|
|
default:
|
|
http_response_code(405);
|
|
echo json_encode(["success" => false, "message" => "Method tidak diizinkan"]);
|
|
}
|
|
}
|
|
|
|
// ════════════════════════════════════════════════════════════════
|
|
// PENDUDUK MISKIN
|
|
// ════════════════════════════════════════════════════════════════
|
|
function handleMiskin($pdo, $method, $input) {
|
|
$validKelas = ['Kelas I', 'Kelas II', 'Kelas III'];
|
|
|
|
switch ($method) {
|
|
case 'GET':
|
|
try {
|
|
// Urutkan: Kelas I dulu (prioritas tertinggi), lalu dalam jangkauan dulu
|
|
$s = $pdo->query(
|
|
"SELECT * FROM penduduk_miskin
|
|
ORDER BY
|
|
FIELD(kelas_kemiskinan, 'Kelas I', 'Kelas II', 'Kelas III'),
|
|
nama_kk ASC"
|
|
);
|
|
echo json_encode(["success" => true, "data" => $s->fetchAll()]);
|
|
} catch (Exception $e) {
|
|
echo json_encode(["success" => true, "data" => [], "warning" => "Tabel belum ada: " . $e->getMessage()]);
|
|
}
|
|
break;
|
|
|
|
case 'POST':
|
|
if (isOperator()) {
|
|
http_response_code(403);
|
|
echo json_encode([
|
|
"success" => false,
|
|
"message" => "Operator tidak punya akses ini"
|
|
]);
|
|
return;
|
|
}
|
|
|
|
foreach (['nama_kk', 'latitude', 'longitude'] as $f) {
|
|
if (!isset($input[$f]) || $input[$f] === '') {
|
|
http_response_code(400);
|
|
echo json_encode(["success" => false, "message" => "Field '$f' wajib diisi"]);
|
|
return;
|
|
}
|
|
}
|
|
if (!empty($input['kelas_kemiskinan']) && !in_array($input['kelas_kemiskinan'], $validKelas)) {
|
|
http_response_code(400);
|
|
echo json_encode(["success" => false, "message" => "Kelas kemiskinan tidak valid"]);
|
|
return;
|
|
}
|
|
$s = $pdo->prepare(
|
|
"INSERT INTO penduduk_miskin (nama_kk, jumlah_jiwa, kelas_kemiskinan, keterangan, alamat, dalam_jangkauan, latitude, longitude)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
|
|
);
|
|
$s->execute([
|
|
trim($input['nama_kk']),
|
|
(int)($input['jumlah_jiwa'] ?? 1),
|
|
$input['kelas_kemiskinan'] ?? 'Kelas I',
|
|
trim($input['keterangan'] ?? ''),
|
|
trim($input['alamat'] ?? ''),
|
|
(int)($input['dalam_jangkauan'] ?? 0),
|
|
(float)$input['latitude'],
|
|
(float)$input['longitude'],
|
|
]);
|
|
echo json_encode(["success" => true, "message" => "Data penduduk miskin disimpan", "id" => $pdo->lastInsertId()]);
|
|
break;
|
|
|
|
case 'PUT':
|
|
if (isOperator()) {
|
|
http_response_code(403);
|
|
echo json_encode([
|
|
"success" => false,
|
|
"message" => "Operator tidak punya akses ini"
|
|
]);
|
|
return;
|
|
}
|
|
if (!isset($input['id'])) {
|
|
http_response_code(400); echo json_encode(["success" => false, "message" => "ID diperlukan"]); return;
|
|
}
|
|
$s = $pdo->prepare(
|
|
"UPDATE penduduk_miskin SET nama_kk=?, jumlah_jiwa=?, kelas_kemiskinan=?, keterangan=?, alamat=?, dalam_jangkauan=?, latitude=?, longitude=?
|
|
WHERE id=?"
|
|
);
|
|
$s->execute([
|
|
trim($input['nama_kk']),
|
|
(int)($input['jumlah_jiwa'] ?? 1),
|
|
$input['kelas_kemiskinan'] ?? 'Kelas I',
|
|
trim($input['keterangan'] ?? ''),
|
|
trim($input['alamat'] ?? ''),
|
|
(int)($input['dalam_jangkauan'] ?? 0),
|
|
(float)$input['latitude'],
|
|
(float)$input['longitude'],
|
|
(int)$input['id'],
|
|
]);
|
|
echo json_encode(["success" => true, "message" => "Data penduduk miskin diperbarui"]);
|
|
break;
|
|
|
|
case 'DELETE':
|
|
if (isOperator()) {
|
|
http_response_code(403);
|
|
echo json_encode([
|
|
"success" => false,
|
|
"message" => "Operator tidak punya akses ini"
|
|
]);
|
|
return;
|
|
}
|
|
|
|
$id = $_GET['id'] ?? $input['id'] ?? null;
|
|
if (!$id) { http_response_code(400); echo json_encode(["success" => false, "message" => "ID diperlukan"]); return; }
|
|
$pdo->prepare("DELETE FROM penduduk_miskin WHERE id=?")->execute([(int)$id]);
|
|
echo json_encode(["success" => true, "message" => "Data penduduk miskin dihapus"]);
|
|
break;
|
|
|
|
default:
|
|
http_response_code(405);
|
|
echo json_encode(["success" => false, "message" => "Method tidak diizinkan"]);
|
|
}
|
|
}
|
|
// ════════════════════════════════════════════════════════════════
|
|
// RIWAYAT BANTUAN
|
|
// ════════════════════════════════════════════════════════════════
|
|
function handleBantuan($pdo, $method, $input) {
|
|
switch ($method) {
|
|
|
|
// GET?resource=bantuan&id_miskin=N — ambil riwayat bantuan 1 KK
|
|
case 'GET':
|
|
$idMiskin = (int)($_GET['id_miskin'] ?? 0);
|
|
if (!$idMiskin) {
|
|
http_response_code(400);
|
|
echo json_encode(["success"=>false,"message"=>"Parameter id_miskin diperlukan"]);
|
|
return;
|
|
}
|
|
$s = $pdo->prepare(
|
|
"SELECT *, DATEDIFF(CURDATE(), tanggal) AS hari_lalu
|
|
FROM riwayat_bantuan
|
|
WHERE id_miskin = ?
|
|
ORDER BY tanggal DESC"
|
|
);
|
|
$s->execute([$idMiskin]);
|
|
$rows = $s->fetchAll();
|
|
|
|
// Hitung apakah sudah dapat bantuan hari ini
|
|
$sudahHariIni = false;
|
|
if (!empty($rows) && $rows[0]['hari_lalu'] == 0) {
|
|
$sudahHariIni = true;
|
|
}
|
|
|
|
echo json_encode([
|
|
"success" => true,
|
|
"data" => $rows,
|
|
"sudah_hari_ini" => $sudahHariIni,
|
|
]);
|
|
break;
|
|
|
|
// POST — tambah riwayat bantuan baru
|
|
case 'POST':
|
|
if (isOperator()) {
|
|
$idMiskin = (int)($input['id_miskin'] ?? 0);
|
|
$idIbadah = myIbadahId();
|
|
|
|
$sMiskin = $pdo->prepare(
|
|
"SELECT latitude, longitude
|
|
FROM penduduk_miskin
|
|
WHERE id=?"
|
|
);
|
|
$sMiskin->execute([$idMiskin]);
|
|
$mk = $sMiskin->fetch();
|
|
|
|
$sIbadah = $pdo->prepare(
|
|
"SELECT latitude, longitude, radius_meter
|
|
FROM rumah_ibadah
|
|
WHERE id=?"
|
|
);
|
|
$sIbadah->execute([$idIbadah]);
|
|
$ib = $sIbadah->fetch();
|
|
|
|
if (!$mk || !$ib) {
|
|
http_response_code(403);
|
|
echo json_encode([
|
|
"success" => false,
|
|
"message" => "Akses ditolak"
|
|
]);
|
|
return;
|
|
}
|
|
|
|
$jarak = haversine(
|
|
$mk['latitude'],
|
|
$mk['longitude'],
|
|
$ib['latitude'],
|
|
$ib['longitude']
|
|
);
|
|
|
|
if ($jarak > $ib['radius_meter']) {
|
|
http_response_code(403);
|
|
echo json_encode([
|
|
"success" => false,
|
|
"message" => "KK ini di luar radius ibadah Anda"
|
|
]);
|
|
return;
|
|
}
|
|
}
|
|
|
|
foreach (['id_miskin','jenis_bantuan'] as $f) {
|
|
if (empty($input[$f])) {
|
|
http_response_code(400);
|
|
echo json_encode(["success"=>false,"message"=>"Field '$f' wajib diisi"]);
|
|
return;
|
|
}
|
|
}
|
|
$tanggal = $input['tanggal'] ?? date('Y-m-d'); // default hari ini
|
|
$s = $pdo->prepare(
|
|
"INSERT INTO riwayat_bantuan (id_miskin, tanggal, jenis_bantuan, keterangan, diberikan_oleh)
|
|
VALUES (?, ?, ?, ?, ?)"
|
|
);
|
|
$s->execute([
|
|
(int)$input['id_miskin'],
|
|
$tanggal,
|
|
trim($input['jenis_bantuan']),
|
|
trim($input['keterangan'] ?? ''),
|
|
trim($input['diberikan_oleh'] ?? ''),
|
|
]);
|
|
echo json_encode(["success"=>true,"message"=>"Riwayat bantuan disimpan","id"=>$pdo->lastInsertId()]);
|
|
break;
|
|
|
|
// DELETE?id=N — hapus satu riwayat bantuan
|
|
case 'DELETE':
|
|
$id = $_GET['id'] ?? $input['id'] ?? null;
|
|
if (!$id) { http_response_code(400); echo json_encode(["success"=>false,"message"=>"ID diperlukan"]); return; }
|
|
$pdo->prepare("DELETE FROM riwayat_bantuan WHERE id=?")->execute([(int)$id]);
|
|
echo json_encode(["success"=>true,"message"=>"Riwayat dihapus"]);
|
|
break;
|
|
|
|
default:
|
|
http_response_code(405);
|
|
echo json_encode(["success"=>false,"message"=>"Method tidak diizinkan"]);
|
|
}
|
|
}
|
|
function haversine($lat1, $lon1, $lat2, $lon2)
|
|
{
|
|
$R = 6371000; // meter
|
|
|
|
$dLat = deg2rad($lat2 - $lat1);
|
|
$dLon = deg2rad($lon2 - $lon1);
|
|
|
|
$a =
|
|
sin($dLat / 2) * sin($dLat / 2) +
|
|
cos(deg2rad($lat1)) *
|
|
cos(deg2rad($lat2)) *
|
|
sin($dLon / 2) *
|
|
sin($dLon / 2);
|
|
|
|
return $R * 2 * atan2(
|
|
sqrt($a),
|
|
sqrt(1 - $a)
|
|
);
|
|
}
|
|
?>
|