Files
WebGIS-Poverty-MAP/api/rumah_ibadah.php
T

149 lines
5.8 KiB
PHP

<?php
// ================================================================
// API: Rumah Ibadah
// Methods: GET, POST, PUT, DELETE
// ================================================================
require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../config/config.php';
require_once __DIR__ . '/../includes/functions.php';
header('Content-Type: application/json; charset=utf-8');
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(204);
exit;
}
$db = getDB();
$method = $_SERVER['REQUEST_METHOD'];
$id = isset($_GET['id']) ? (int)$_GET['id'] : null;
// ── GET ────────────────────────────────────────────────────────
if ($method === 'GET') {
if ($id) {
// Single record
$stmt = $db->prepare("
SELECT ri.*,
(SELECT COUNT(*) FROM penduduk_miskin pm WHERE pm.rumah_ibadah_id = ri.id) AS jumlah_binaan
FROM rumah_ibadah ri WHERE ri.id = ?
");
$stmt->execute([$id]);
$row = $stmt->fetch();
if (!$row) jsonResponse(['success' => false, 'message' => 'Data tidak ditemukan'], 404);
jsonResponse(['success' => true, 'data' => $row]);
}
// List dengan filter
$where = ['1=1'];
$params = [];
if (!empty($_GET['jenis'])) {
$where[] = 'jenis = ?';
$params[] = $_GET['jenis'];
}
if (!empty($_GET['kecamatan'])) {
$where[] = 'kecamatan = ?';
$params[] = $_GET['kecamatan'];
}
if (!empty($_GET['search'])) {
$where[] = 'nama LIKE ?';
$params[] = '%' . $_GET['search'] . '%';
}
$sql = "SELECT ri.*,
(SELECT COUNT(*) FROM penduduk_miskin pm WHERE pm.rumah_ibadah_id = ri.id) AS jumlah_binaan
FROM rumah_ibadah ri
WHERE " . implode(' AND ', $where) . "
ORDER BY ri.nama ASC";
$stmt = $db->prepare($sql);
$stmt->execute($params);
$rows = $stmt->fetchAll();
jsonResponse(['success' => true, 'data' => $rows, 'total' => count($rows)]);
}
// ── POST ───────────────────────────────────────────────────────
if ($method === 'POST') {
$body = json_decode(file_get_contents('php://input'), true) ?? $_POST;
$required = ['nama', 'jenis', 'lat', 'lng'];
foreach ($required as $f) {
if (empty($body[$f])) jsonResponse(['success' => false, 'message' => "Field '$f' wajib diisi"], 422);
}
$stmt = $db->prepare("
INSERT INTO rumah_ibadah (nama, jenis, kontak, alamat, kelurahan, kecamatan, lat, lng, radius)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
");
$stmt->execute([
sanitize($body['nama']),
$body['jenis'],
sanitize($body['kontak'] ?? ''),
sanitize($body['alamat'] ?? ''),
sanitize($body['kelurahan'] ?? ''),
sanitize($body['kecamatan'] ?? ''),
(float)$body['lat'],
(float)$body['lng'],
(int)($body['radius'] ?? RADIUS_DEFAULT),
]);
$newId = $db->lastInsertId();
$new = $db->query("SELECT * FROM rumah_ibadah WHERE id = $newId")->fetch();
jsonResponse(['success' => true, 'message' => 'Rumah ibadah berhasil ditambahkan', 'data' => $new], 201);
}
// ── PUT ────────────────────────────────────────────────────────
if ($method === 'PUT') {
if (!$id) jsonResponse(['success' => false, 'message' => 'ID wajib disertakan'], 400);
$body = json_decode(file_get_contents('php://input'), true) ?? [];
$stmt = $db->prepare("
UPDATE rumah_ibadah
SET nama=?, jenis=?, kontak=?, alamat=?, kelurahan=?, kecamatan=?, lat=?, lng=?, radius=?
WHERE id=?
");
$stmt->execute([
sanitize($body['nama'] ?? ''),
$body['jenis'] ?? 'Masjid',
sanitize($body['kontak'] ?? ''),
sanitize($body['alamat'] ?? ''),
sanitize($body['kelurahan'] ?? ''),
sanitize($body['kecamatan'] ?? ''),
(float)($body['lat'] ?? 0),
(float)($body['lng'] ?? 0),
(int)($body['radius'] ?? RADIUS_DEFAULT),
$id,
]);
// Re-assign penduduk yang terhubung jika radius berubah
reassignPendudukAfterIbadahUpdate();
$updated = $db->query("SELECT * FROM rumah_ibadah WHERE id = $id")->fetch();
jsonResponse(['success' => true, 'message' => 'Data berhasil diperbarui', 'data' => $updated]);
}
// ── DELETE ─────────────────────────────────────────────────────
if ($method === 'DELETE') {
if (!$id) jsonResponse(['success' => false, 'message' => 'ID wajib disertakan'], 400);
$stmt = $db->prepare("DELETE FROM rumah_ibadah WHERE id = ?");
$stmt->execute([$id]);
if ($stmt->rowCount() === 0) jsonResponse(['success' => false, 'message' => 'Data tidak ditemukan'], 404);
jsonResponse(['success' => true, 'message' => 'Data berhasil dihapus']);
}
function reassignPendudukAfterIbadahUpdate(): void {
$db = getDB();
$penduduk = $db->query("SELECT id, lat, lng FROM penduduk_miskin")->fetchAll();
foreach ($penduduk as $p) {
$nearest = findNearestIbadah((float)$p['lat'], (float)$p['lng']);
if ($nearest) {
$stmt = $db->prepare("UPDATE penduduk_miskin SET rumah_ibadah_id=?, jarak_ke_ibadah=? WHERE id=?");
$stmt->execute([$nearest['id'], $nearest['jarak'], $p['id']]);
}
}
}
jsonResponse(['success' => false, 'message' => 'Method tidak didukung'], 405);