149 lines
5.8 KiB
PHP
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);
|