248 lines
9.6 KiB
PHP
248 lines
9.6 KiB
PHP
<?php
|
|
/**
|
|
* WebGIS - API Manajemen Data Jalan
|
|
*
|
|
* Endpoint : /api/jalan.php
|
|
* Tabel : tb_jalan
|
|
* Geometri : GeoJSON LineString
|
|
*/
|
|
|
|
// Matikan display_errors agar PHP tidak output HTML error (merusak JSON)
|
|
ini_set('display_errors', 0);
|
|
ini_set('display_startup_errors', 0);
|
|
error_reporting(0);
|
|
|
|
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');
|
|
|
|
/* Handle preflight request */
|
|
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
|
http_response_code(200);
|
|
exit;
|
|
}
|
|
|
|
require_once __DIR__ . '/db.php';
|
|
|
|
$conn = getConnection();
|
|
$method = $_SERVER['REQUEST_METHOD'];
|
|
$id = isset($_GET['id']) ? (int)$_GET['id'] : null;
|
|
|
|
try {
|
|
|
|
switch ($method) {
|
|
|
|
/* ============================================================
|
|
READ — Ambil semua atau satu data jalan
|
|
============================================================ */
|
|
case 'GET':
|
|
if ($id) {
|
|
/* Satu data */
|
|
$stmt = $conn->prepare(
|
|
"SELECT id, nama_jalan, status_jalan, panjang_jalan, geojson, created_at
|
|
FROM tb_jalan WHERE id = ?"
|
|
);
|
|
$stmt->bind_param('i', $id);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
$row = $result->fetch_assoc();
|
|
|
|
if ($row) {
|
|
$row['geojson'] = json_decode($row['geojson']); // parse ke objek
|
|
echo json_encode($row);
|
|
} else {
|
|
http_response_code(404);
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'Data jalan tidak ditemukan']);
|
|
}
|
|
|
|
} else {
|
|
/* Semua data */
|
|
$filter = isset($_GET['status']) ? $_GET['status'] : null;
|
|
|
|
if ($filter) {
|
|
$stmt = $conn->prepare(
|
|
"SELECT id, nama_jalan, status_jalan, panjang_jalan, geojson, created_at
|
|
FROM tb_jalan WHERE status_jalan = ? ORDER BY created_at DESC"
|
|
);
|
|
$stmt->bind_param('s', $filter);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
} else {
|
|
$result = $conn->query(
|
|
"SELECT id, nama_jalan, status_jalan, panjang_jalan, geojson, created_at
|
|
FROM tb_jalan ORDER BY created_at DESC"
|
|
);
|
|
}
|
|
|
|
$data = [];
|
|
while ($row = $result->fetch_assoc()) {
|
|
$row['geojson'] = json_decode($row['geojson']);
|
|
$data[] = $row;
|
|
}
|
|
echo json_encode($data);
|
|
}
|
|
break;
|
|
|
|
/* ============================================================
|
|
CREATE — Simpan data jalan baru
|
|
Body (JSON):
|
|
{
|
|
"nama_jalan" : "Jalan Ahmad Yani",
|
|
"status_jalan" : "Nasional", // Nasional|Provinsi|Kabupaten
|
|
"panjang_jalan" : 2345.67, // meter, dihitung oleh LeafletJS
|
|
"geojson" : { // GeoJSON LineString
|
|
"type": "LineString",
|
|
"coordinates": [[lng,lat], ...]
|
|
}
|
|
}
|
|
============================================================ */
|
|
case 'POST':
|
|
$body = json_decode(file_get_contents('php://input'), true);
|
|
|
|
if (!$body) {
|
|
http_response_code(400);
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'Body request tidak valid atau bukan JSON']);
|
|
break;
|
|
}
|
|
|
|
$nama_jalan = trim($body['nama_jalan'] ?? '');
|
|
$status_jalan = trim($body['status_jalan'] ?? '');
|
|
$panjang_jalan = (float)($body['panjang_jalan'] ?? 0);
|
|
$geojson_raw = $body['geojson'] ?? null;
|
|
|
|
/* Validasi */
|
|
$valid_status = ['Nasional', 'Provinsi', 'Kabupaten'];
|
|
if (!$nama_jalan) {
|
|
http_response_code(400);
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'nama_jalan tidak boleh kosong']);
|
|
break;
|
|
}
|
|
if (!in_array($status_jalan, $valid_status)) {
|
|
http_response_code(400);
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'status_jalan tidak valid. Pilih: Nasional, Provinsi, atau Kabupaten']);
|
|
break;
|
|
}
|
|
if (!$geojson_raw || ($geojson_raw['type'] ?? '') !== 'LineString') {
|
|
http_response_code(400);
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'geojson harus bertipe LineString']);
|
|
break;
|
|
}
|
|
|
|
$geojson_str = json_encode($geojson_raw);
|
|
|
|
$stmt = $conn->prepare(
|
|
"INSERT INTO tb_jalan (nama_jalan, status_jalan, panjang_jalan, geojson)
|
|
VALUES (?, ?, ?, ?)"
|
|
);
|
|
$stmt->bind_param('ssds', $nama_jalan, $status_jalan, $panjang_jalan, $geojson_str);
|
|
|
|
if ($stmt->execute()) {
|
|
echo json_encode([
|
|
'status' => 'sukses',
|
|
'id' => $conn->insert_id,
|
|
'pesan' => 'Data jalan berhasil disimpan'
|
|
]);
|
|
} else {
|
|
throw new Exception($stmt->error);
|
|
}
|
|
break;
|
|
|
|
/* ============================================================
|
|
UPDATE — Perbarui atribut dan/atau koordinat jalan
|
|
Mengirim field yang ingin diubah saja:
|
|
- Edit atribut : { "nama_jalan": "...", "status_jalan": "..." }
|
|
- Geser vertex : { "geojson": {...}, "panjang_jalan": 1234.5 }
|
|
- Keduanya : { semua field }
|
|
============================================================ */
|
|
case 'PUT':
|
|
if (!$id) {
|
|
http_response_code(400);
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'Parameter id diperlukan']);
|
|
break;
|
|
}
|
|
|
|
$body = json_decode(file_get_contents('php://input'), true);
|
|
if (!$body) {
|
|
http_response_code(400);
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'Body tidak valid']);
|
|
break;
|
|
}
|
|
|
|
/* Bangun query dinamis berdasarkan field yang dikirim */
|
|
$setClauses = [];
|
|
$paramVals = [];
|
|
$paramTypes = '';
|
|
|
|
if (array_key_exists('nama_jalan', $body)) {
|
|
$v = trim($body['nama_jalan']);
|
|
if (!$v) { http_response_code(400); echo json_encode(['status'=>'gagal','pesan'=>'nama_jalan tidak boleh kosong']); break; }
|
|
$setClauses[] = 'nama_jalan = ?'; $paramVals[] = $v; $paramTypes .= 's';
|
|
}
|
|
if (array_key_exists('status_jalan', $body)) {
|
|
$valid = ['Nasional','Provinsi','Kabupaten'];
|
|
if (!in_array($body['status_jalan'], $valid)) {
|
|
http_response_code(400); echo json_encode(['status'=>'gagal','pesan'=>'status_jalan tidak valid']); break;
|
|
}
|
|
$setClauses[] = 'status_jalan = ?'; $paramVals[] = $body['status_jalan']; $paramTypes .= 's';
|
|
}
|
|
if (array_key_exists('panjang_jalan', $body)) {
|
|
$setClauses[] = 'panjang_jalan = ?'; $paramVals[] = (float)$body['panjang_jalan']; $paramTypes .= 'd';
|
|
}
|
|
if (array_key_exists('geojson', $body)) {
|
|
$setClauses[] = 'geojson = ?'; $paramVals[] = json_encode($body['geojson']); $paramTypes .= 's';
|
|
}
|
|
|
|
if (empty($setClauses)) {
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'Tidak ada field yang dikirim untuk diupdate']);
|
|
break;
|
|
}
|
|
|
|
$paramVals[] = $id;
|
|
$paramTypes .= 'i';
|
|
|
|
$sql = 'UPDATE tb_jalan SET ' . implode(', ', $setClauses) . ' WHERE id = ?';
|
|
$stmt = $conn->prepare($sql);
|
|
$stmt->bind_param($paramTypes, ...$paramVals);
|
|
|
|
if ($stmt->execute()) {
|
|
echo json_encode(['status' => 'sukses', 'pesan' => 'Data jalan berhasil diperbarui']);
|
|
} else {
|
|
throw new Exception($stmt->error);
|
|
}
|
|
break;
|
|
|
|
/* ============================================================
|
|
DELETE — Hapus data jalan
|
|
============================================================ */
|
|
case 'DELETE':
|
|
if (!$id) {
|
|
http_response_code(400);
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'Parameter id diperlukan']);
|
|
break;
|
|
}
|
|
|
|
$stmt = $conn->prepare("DELETE FROM tb_jalan WHERE id = ?");
|
|
$stmt->bind_param('i', $id);
|
|
|
|
if ($stmt->execute() && $stmt->affected_rows > 0) {
|
|
echo json_encode(['status' => 'sukses', 'pesan' => 'Data jalan berhasil dihapus']);
|
|
} else {
|
|
http_response_code(404);
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'Data tidak ditemukan atau sudah dihapus']);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
http_response_code(405);
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'Method tidak didukung']);
|
|
}
|
|
|
|
} catch (Exception $e) {
|
|
http_response_code(500);
|
|
echo json_encode(['status' => 'gagal', 'pesan' => 'Server error: ' . $e->getMessage()]);
|
|
} finally {
|
|
if ($conn) $conn->close();
|
|
}
|