query( "SELECT ri.*, u.nama_lengkap AS nama_pengurus, COUNT(DISTINCT k.id) AS jumlah_kk, COUNT(DISTINCT p.nik) AS jumlah_penduduk FROM rumah_ibadah ri LEFT JOIN user u ON ri.id_user=u.id LEFT JOIN keluarga k ON k.id_rumah_ibadah=ri.id LEFT JOIN penduduk p ON p.id_keluarga=k.id AND p.status_hidup='hidup' WHERE ri.aktif=1 GROUP BY ri.id ORDER BY ri.jenis, ri.nama" )->fetchAll(); jsonSuccess($rows); } public function show(string $id): void { $db = getDB(); $stmt = $db->prepare("SELECT ri.*, u.nama_lengkap AS nama_pengurus FROM rumah_ibadah ri LEFT JOIN user u ON ri.id_user=u.id WHERE ri.id=?"); $stmt->execute([$id]); $row = $stmt->fetch(); if (!$row) jsonError('Rumah ibadah tidak ditemukan', 404); jsonSuccess($row); } public function store(): void { requireAuth([ROLE_ADMIN, ROLE_PENGURUS]); $body = getBody(); $errs = required($body, ['nama','jenis','lat','lng']); if ($errs) jsonError(implode('; ',$errs)); $db = getDB(); $db->prepare( "INSERT INTO rumah_ibadah (id_user,nama,jenis,alamat,lat,lng,radius_meter,kontak,kecamatan,kelurahan) VALUES (?,?,?,?,?,?,?,?,?,?)" )->execute([ $body['id_user'] ?? null, sanitize($body['nama']), $body['jenis'], sanitize($body['alamat'] ?? ''), $body['lat'], $body['lng'], (int)($body['radius_meter'] ?? 300), sanitize($body['kontak'] ?? ''), sanitize($body['kecamatan'] ?? ''), sanitize($body['kelurahan'] ?? ''), ]); jsonSuccess(['id' => $db->lastInsertId()], 'Rumah ibadah ditambahkan', 201); } public function update(string $id): void { requireAuth([ROLE_ADMIN, ROLE_PENGURUS]); $body = getBody(); $db = getDB(); $db->prepare( "UPDATE rumah_ibadah SET nama=?,jenis=?,alamat=?,lat=?,lng=?,radius_meter=?,kontak=?,kecamatan=?,kelurahan=? WHERE id=?" )->execute([ sanitize($body['nama'] ?? ''), $body['jenis'] ?? 'Masjid', sanitize($body['alamat'] ?? ''), $body['lat'] ?? 0, $body['lng'] ?? 0, (int)($body['radius_meter'] ?? 300), sanitize($body['kontak'] ?? ''), sanitize($body['kecamatan'] ?? ''), sanitize($body['kelurahan'] ?? ''), $id, ]); jsonSuccess([], 'Rumah ibadah diperbarui'); } public function destroy(string $id): void { requireAuth([ROLE_ADMIN]); getDB()->prepare("UPDATE rumah_ibadah SET aktif=0 WHERE id=?")->execute([$id]); jsonSuccess([], 'Rumah ibadah dinonaktifkan'); } }