Harden Project 01 public endpoints

This commit is contained in:
Andrie
2026-06-11 23:15:42 +07:00
parent a90748d9c1
commit 6f4488c1b8
39 changed files with 1183 additions and 612 deletions
+3 -3
View File
@@ -8,8 +8,8 @@ $result = $conn->query(
);
if ($result === false) {
echo json_encode(['status' => 'error', 'message' => 'Tabel belum ada. Jalankan setup_database.sql terlebih dahulu. (' . $conn->error . ')']);
$conn->close(); exit;
error_log('Project 01 choropleth metadata read failed: ' . $conn->error);
json_error('Gagal memuat layer.', 500);
}
$rows = [];
@@ -26,4 +26,4 @@ while ($r = $result->fetch_assoc()) {
}
$conn->close();
echo json_encode(['status' => 'success', 'data' => $rows, 'total' => count($rows)]);
json_success(['data' => $rows, 'total' => count($rows)]);
+7 -4
View File
@@ -4,10 +4,14 @@ header('Content-Type: application/json');
$id = (int)($_GET['id'] ?? 0);
if ($id <= 0) {
echo json_encode(['status' => 'error', 'message' => 'ID tidak valid.']); exit;
json_error('ID tidak valid.', 400);
}
$stmt = $conn->prepare("SELECT geojson FROM choropleth_layers WHERE id = ?");
$stmt = $conn->prepare("SELECT geojson FROM choropleth_layers WHERE id = ? AND is_visible = 1");
if (!$stmt) {
error_log('Project 01 choropleth geojson prepare failed: ' . $conn->error);
json_error('Gagal memuat GeoJSON.', 500);
}
$stmt->bind_param('i', $id);
$stmt->execute();
$row = $stmt->get_result()->fetch_assoc();
@@ -15,8 +19,7 @@ $stmt->close();
$conn->close();
if (!$row) {
http_response_code(404);
echo json_encode(['status' => 'error', 'message' => 'Layer tidak ditemukan.']); exit;
json_error('Layer tidak ditemukan.', 404);
}
echo $row['geojson'];
+18 -16
View File
@@ -1,26 +1,28 @@
<?php
require_once '../../koneksi.php';
require_admin_json();
header('Content-Type: application/json');
require_once '../../auth/helper.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['status' => 'error', 'message' => 'Method tidak valid.']); exit;
}
require_admin_post();
require_once '../../koneksi.php';
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
echo json_encode(['status' => 'error', 'message' => 'ID tidak valid.']); exit;
json_error('ID tidak valid.', 400);
}
$stmt = $conn->prepare("DELETE FROM choropleth_layers WHERE id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$affected = $stmt->affected_rows;
$stmt->close();
$conn->close();
if ($affected === 0) {
echo json_encode(['status' => 'error', 'message' => 'Layer tidak ditemukan.']); exit;
if (!$stmt) {
error_log('Project 01 choropleth delete prepare failed: ' . $conn->error);
json_error('Gagal menghapus layer.', 500);
}
echo json_encode(['status' => 'success']);
$stmt->bind_param('i', $id);
if (!$stmt->execute()) {
error_log('Project 01 choropleth delete failed: ' . $stmt->error);
json_error('Gagal menghapus layer.', 500);
}
if ($stmt->affected_rows <= 0) {
json_error('Layer tidak ditemukan.', 404);
}
json_success();
+23 -11
View File
@@ -1,27 +1,39 @@
<?php
require_once '../../koneksi.php';
require_admin_json();
header('Content-Type: application/json');
require_once '../../auth/helper.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['status' => 'error', 'message' => 'Method tidak valid.']); exit;
}
require_admin_post();
require_once '../../koneksi.php';
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
echo json_encode(['status' => 'error', 'message' => 'ID tidak valid.']); exit;
json_error('ID tidak valid.', 400);
}
$stmt = $conn->prepare("UPDATE choropleth_layers SET is_visible = 1 - is_visible WHERE id = ?");
if (!$stmt) {
error_log('Project 01 choropleth toggle prepare failed: ' . $conn->error);
json_error('Gagal mengubah visibilitas layer.', 500);
}
$stmt->bind_param('i', $id);
$stmt->execute();
if (!$stmt->execute()) {
error_log('Project 01 choropleth toggle failed: ' . $stmt->error);
json_error('Gagal mengubah visibilitas layer.', 500);
}
$stmt->close();
$stmt2 = $conn->prepare("SELECT is_visible FROM choropleth_layers WHERE id = ?");
if (!$stmt2) {
error_log('Project 01 choropleth visibility prepare failed: ' . $conn->error);
json_error('Gagal memuat status layer.', 500);
}
$stmt2->bind_param('i', $id);
$stmt2->execute();
$row = $stmt2->get_result()->fetch_assoc();
$stmt2->close();
$conn->close();
echo json_encode(['status' => 'success', 'is_visible' => (bool)$row['is_visible']]);
if (!$row) {
json_error('Layer tidak ditemukan.', 404);
}
json_success(['is_visible' => (bool)$row['is_visible']]);
+28 -35
View File
@@ -1,54 +1,47 @@
<?php
require_once '../../auth/helper.php';
require_once '../../includes/validation.php';
require_admin_post();
require_once '../../koneksi.php';
require_admin_json();
header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['status' => 'error', 'message' => 'Method tidak valid.']); exit;
}
$nama = clean_string($_POST['nama'] ?? '', 150);
$deskripsi = clean_string($_POST['deskripsi'] ?? '', 500);
$attrKey = clean_string($_POST['attribute_key'] ?? '', 100);
$palette = validate_enum($_POST['palette'] ?? '', ['blue', 'orange', 'green', 'purple']) ?? 'blue';
$nama = trim($_POST['nama'] ?? '');
$deskripsi = trim($_POST['deskripsi'] ?? '');
$attr_key = trim($_POST['attribute_key'] ?? '');
$palette = in_array($_POST['palette'] ?? '', ['blue', 'orange', 'green', 'purple'])
? $_POST['palette'] : 'blue';
if (!$nama || !$attr_key) {
echo json_encode(['status' => 'error', 'message' => 'Nama layer dan atribut wajib diisi.']); exit;
if ($nama === '' || $attrKey === '') {
json_error('Nama layer dan atribut wajib diisi.', 400);
}
if (empty($_FILES['geojson']['tmp_name']) || $_FILES['geojson']['error'] !== UPLOAD_ERR_OK) {
echo json_encode(['status' => 'error', 'message' => 'File GeoJSON tidak ditemukan atau gagal diupload.']); exit;
json_error('File GeoJSON tidak ditemukan atau gagal diupload.', 400);
}
if ($_FILES['geojson']['size'] > 10 * 1024 * 1024) {
echo json_encode(['status' => 'error', 'message' => 'File terlalu besar (maksimum 10 MB).']); exit;
if ($_FILES['geojson']['size'] > MAX_GEOJSON_BYTES) {
json_error('File terlalu besar.', 400);
}
$raw = file_get_contents($_FILES['geojson']['tmp_name']);
if ($raw === false) {
echo json_encode(['status' => 'error', 'message' => 'Gagal membaca file.']); exit;
json_error('Gagal membaca file.', 400);
}
$gj = json_decode($raw, true);
if (!$gj || !isset($gj['type']) || $gj['type'] !== 'FeatureCollection') {
echo json_encode(['status' => 'error', 'message' => 'File bukan GeoJSON FeatureCollection yang valid.']); exit;
}
if (empty($gj['features'])) {
echo json_encode(['status' => 'error', 'message' => 'GeoJSON tidak memiliki fitur/data.']); exit;
}
$first_props = $gj['features'][0]['properties'] ?? [];
if (!array_key_exists($attr_key, $first_props)) {
$available = implode(', ', array_keys($first_props));
echo json_encode(['status' => 'error', 'message' => "Atribut '{$attr_key}' tidak ditemukan. Tersedia: {$available}"]); exit;
$geojson = decode_geojson($raw);
if ($geojson === null || !validate_feature_collection($geojson, $attrKey)) {
json_error('GeoJSON tidak valid atau atribut choropleth tidak lengkap.', 400);
}
$stmt = $conn->prepare("INSERT INTO choropleth_layers (nama, deskripsi, geojson, attribute_key, palette) VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param('sssss', $nama, $deskripsi, $raw, $attr_key, $palette);
$stmt->execute();
$id = $conn->insert_id;
$stmt->close();
$conn->close();
if (!$stmt) {
error_log('Project 01 choropleth upload prepare failed: ' . $conn->error);
json_error('Gagal menyimpan layer.', 500);
}
echo json_encode(['status' => 'success', 'id' => $id, 'nama' => $nama]);
$stmt->bind_param('sssss', $nama, $deskripsi, $raw, $attrKey, $palette);
if (!$stmt->execute()) {
error_log('Project 01 choropleth upload failed: ' . $stmt->error);
json_error('Gagal menyimpan layer.', 500);
}
json_success(['id' => $conn->insert_id, 'nama' => $nama]);
+3 -3
View File
@@ -6,8 +6,8 @@ require_once '../../koneksi.php';
$result = $conn->query("SELECT id, nama_jalan, status_jalan, geojson, panjang_meter FROM data_jalan ORDER BY id DESC");
if (!$result) {
echo json_encode(['status' => 'error', 'message' => $conn->error]);
exit;
error_log('Project 01 road read failed: ' . $conn->error);
json_error('Gagal memuat data jalan.', 500);
}
$data = [];
@@ -21,4 +21,4 @@ echo json_encode([
'data' => $data
]);
$conn->close();
$conn->close();
+20 -19
View File
@@ -1,27 +1,28 @@
<?php
// api/jalan/hapus.php — Hapus data jalan
header('Content-Type: application/json');
require_once '../../auth/helper.php';
require_admin_post();
require_once '../../koneksi.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['status' => 'error', 'message' => 'Method not allowed']);
exit;
}
$id = (int) ($_POST['id'] ?? 0);
if (!$id) {
echo json_encode(['status' => 'error', 'message' => 'ID tidak valid']);
exit;
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
json_error('ID tidak valid.', 400);
}
$stmt = $conn->prepare("DELETE FROM data_jalan WHERE id = ?");
$stmt->bind_param('i', $id);
if ($stmt->execute() && $stmt->affected_rows > 0) {
echo json_encode(['status' => 'success', 'message' => 'Data jalan berhasil dihapus']);
} else {
echo json_encode(['status' => 'error', 'message' => 'Data tidak ditemukan atau gagal dihapus']);
if (!$stmt) {
error_log('Project 01 road delete prepare failed: ' . $conn->error);
json_error('Gagal menghapus data jalan.', 500);
}
$stmt->close();
$conn->close();
$stmt->bind_param('i', $id);
if (!$stmt->execute()) {
error_log('Project 01 road delete failed: ' . $stmt->error);
json_error('Gagal menghapus data jalan.', 500);
}
if ($stmt->affected_rows <= 0) {
json_error('Data jalan tidak ditemukan.', 404);
}
json_success(['message' => 'Data jalan berhasil dihapus']);
+30 -47
View File
@@ -1,56 +1,39 @@
<?php
// api/jalan/simpan.php — Simpan data jalan baru
header('Content-Type: application/json');
require_once '../../auth/helper.php';
require_once '../../includes/validation.php';
require_admin_post();
require_once '../../koneksi.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['status' => 'error', 'message' => 'Method not allowed']);
exit;
}
$nama = clean_string($_POST['nama_jalan'] ?? '', 150);
$statusJalan = validate_enum($_POST['status_jalan'] ?? '', ['Nasional', 'Provinsi', 'Kabupaten']);
$geojsonRaw = trim($_POST['geojson'] ?? '');
$decoded = decode_geojson($geojsonRaw);
$panjang = max(0, (float)($_POST['panjang_meter'] ?? 0));
$nama = trim($_POST['nama_jalan'] ?? '');
$status_jalan = trim($_POST['status_jalan'] ?? '');
$geojson = trim($_POST['geojson'] ?? '');
$panjang = (float) ($_POST['panjang_meter'] ?? 0);
$allowed_status = ['Nasional', 'Provinsi', 'Kabupaten'];
if (!$nama) {
echo json_encode(['status' => 'error', 'message' => 'Nama jalan tidak boleh kosong']);
exit;
}
if (!in_array($status_jalan, $allowed_status)) {
echo json_encode(['status' => 'error', 'message' => 'Status jalan tidak valid']);
exit;
}
// Validasi JSON
json_decode($geojson);
if (json_last_error() !== JSON_ERROR_NONE) {
echo json_encode(['status' => 'error', 'message' => 'Data geometri tidak valid']);
exit;
if ($nama === '' || $statusJalan === null || $decoded === null || !validate_geojson_geometry($decoded, ['LineString'])) {
json_error('Data jalan tidak valid.', 400);
}
$stmt = $conn->prepare("INSERT INTO data_jalan (nama_jalan, status_jalan, geojson, panjang_meter) VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $nama, $status_jalan, $geojson, $panjang);
if ($stmt->execute()) {
$id = $conn->insert_id;
echo json_encode([
'status' => 'success',
'message' => 'Data jalan berhasil disimpan',
'data' => [
'id' => $id,
'nama_jalan' => $nama,
'status_jalan' => $status_jalan,
'geojson' => $geojson,
'panjang_meter' => $panjang
]
]);
} else {
echo json_encode(['status' => 'error', 'message' => 'Gagal menyimpan: ' . $stmt->error]);
if (!$stmt) {
error_log('Project 01 road insert prepare failed: ' . $conn->error);
json_error('Gagal menyimpan data jalan.', 500);
}
$stmt->close();
$conn->close();
$stmt->bind_param('sssd', $nama, $statusJalan, $geojsonRaw, $panjang);
if (!$stmt->execute()) {
error_log('Project 01 road insert failed: ' . $stmt->error);
json_error('Gagal menyimpan data jalan.', 500);
}
json_success([
'message' => 'Data jalan berhasil disimpan',
'data' => [
'id' => $conn->insert_id,
'nama_jalan' => $nama,
'status_jalan' => $statusJalan,
'geojson' => $geojsonRaw,
'panjang_meter' => $panjang,
],
]);
+3 -3
View File
@@ -6,8 +6,8 @@ require_once '../../koneksi.php';
$result = $conn->query("SELECT id, nama_parsil, status_kepemilikan, geojson, luas_m2 FROM data_parsil ORDER BY id DESC");
if (!$result) {
echo json_encode(['status' => 'error', 'message' => $conn->error]);
exit;
error_log('Project 01 parcel read failed: ' . $conn->error);
json_error('Gagal memuat data parsil.', 500);
}
$data = [];
@@ -21,4 +21,4 @@ echo json_encode([
'data' => $data
]);
$conn->close();
$conn->close();
+20 -19
View File
@@ -1,27 +1,28 @@
<?php
// api/parsil/hapus.php — Hapus data parsil tanah
header('Content-Type: application/json');
require_once '../../auth/helper.php';
require_admin_post();
require_once '../../koneksi.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['status' => 'error', 'message' => 'Method not allowed']);
exit;
}
$id = (int) ($_POST['id'] ?? 0);
if (!$id) {
echo json_encode(['status' => 'error', 'message' => 'ID tidak valid']);
exit;
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
json_error('ID tidak valid.', 400);
}
$stmt = $conn->prepare("DELETE FROM data_parsil WHERE id = ?");
$stmt->bind_param('i', $id);
if ($stmt->execute() && $stmt->affected_rows > 0) {
echo json_encode(['status' => 'success', 'message' => 'Data parsil berhasil dihapus']);
} else {
echo json_encode(['status' => 'error', 'message' => 'Data tidak ditemukan atau gagal dihapus']);
if (!$stmt) {
error_log('Project 01 parcel delete prepare failed: ' . $conn->error);
json_error('Gagal menghapus data parsil.', 500);
}
$stmt->close();
$conn->close();
$stmt->bind_param('i', $id);
if (!$stmt->execute()) {
error_log('Project 01 parcel delete failed: ' . $stmt->error);
json_error('Gagal menghapus data parsil.', 500);
}
if ($stmt->affected_rows <= 0) {
json_error('Data parsil tidak ditemukan.', 404);
}
json_success(['message' => 'Data parsil berhasil dihapus']);
+30 -46
View File
@@ -1,55 +1,39 @@
<?php
// api/parsil/simpan.php — Simpan data parsil tanah baru
header('Content-Type: application/json');
require_once '../../auth/helper.php';
require_once '../../includes/validation.php';
require_admin_post();
require_once '../../koneksi.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['status' => 'error', 'message' => 'Method not allowed']);
exit;
}
$nama = clean_string($_POST['nama_parsil'] ?? '', 150);
$status = validate_enum($_POST['status_kepemilikan'] ?? '', ['SHM', 'HGB', 'HGU', 'HP']);
$geojsonRaw = trim($_POST['geojson'] ?? '');
$decoded = decode_geojson($geojsonRaw);
$luas = max(0, (float)($_POST['luas_m2'] ?? 0));
$nama = trim($_POST['nama_parsil'] ?? '');
$status = trim($_POST['status_kepemilikan'] ?? '');
$geojson = trim($_POST['geojson'] ?? '');
$luas = (float) ($_POST['luas_m2'] ?? 0);
$allowed_status = ['SHM', 'HGB', 'HGU', 'HP'];
if (!$nama) {
echo json_encode(['status' => 'error', 'message' => 'Nama parsil tidak boleh kosong']);
exit;
}
if (!in_array($status, $allowed_status)) {
echo json_encode(['status' => 'error', 'message' => 'Status kepemilikan tidak valid']);
exit;
}
json_decode($geojson);
if (json_last_error() !== JSON_ERROR_NONE) {
echo json_encode(['status' => 'error', 'message' => 'Data geometri tidak valid']);
exit;
if ($nama === '' || $status === null || $decoded === null || !validate_geojson_geometry($decoded, ['Polygon'])) {
json_error('Data parsil tidak valid.', 400);
}
$stmt = $conn->prepare("INSERT INTO data_parsil (nama_parsil, status_kepemilikan, geojson, luas_m2) VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $nama, $status, $geojson, $luas);
if ($stmt->execute()) {
$id = $conn->insert_id;
echo json_encode([
'status' => 'success',
'message' => 'Data parsil berhasil disimpan',
'data' => [
'id' => $id,
'nama_parsil' => $nama,
'status_kepemilikan' => $status,
'geojson' => $geojson,
'luas_m2' => $luas
]
]);
} else {
echo json_encode(['status' => 'error', 'message' => 'Gagal menyimpan: ' . $stmt->error]);
if (!$stmt) {
error_log('Project 01 parcel insert prepare failed: ' . $conn->error);
json_error('Gagal menyimpan data parsil.', 500);
}
$stmt->close();
$conn->close();
$stmt->bind_param('sssd', $nama, $status, $geojsonRaw, $luas);
if (!$stmt->execute()) {
error_log('Project 01 parcel insert failed: ' . $stmt->error);
json_error('Gagal menyimpan data parsil.', 500);
}
json_success([
'message' => 'Data parsil berhasil disimpan',
'data' => [
'id' => $conn->insert_id,
'nama_parsil' => $nama,
'status_kepemilikan' => $status,
'geojson' => $geojsonRaw,
'luas_m2' => $luas,
],
]);
+3 -3
View File
@@ -6,8 +6,8 @@ require_once '../../koneksi.php';
$result = $conn->query("SELECT id, nama_tempat, no_wa, buka_24jam, latitude, longitude FROM lokasi_usaha ORDER BY id DESC");
if (!$result) {
echo json_encode(['status' => 'error', 'message' => $conn->error]);
exit;
error_log('Project 01 point read failed: ' . $conn->error);
json_error('Gagal memuat data lokasi.', 500);
}
$data = [];
@@ -21,4 +21,4 @@ echo json_encode([
'data' => $data
]);
$conn->close();
$conn->close();
+20 -19
View File
@@ -1,27 +1,28 @@
<?php
// api/point/hapus.php — Hapus POI
header('Content-Type: application/json');
require_once '../../auth/helper.php';
require_admin_post();
require_once '../../koneksi.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['status' => 'error', 'message' => 'Method not allowed']);
exit;
}
$id = (int) ($_POST['id'] ?? 0);
if (!$id) {
echo json_encode(['status' => 'error', 'message' => 'ID tidak valid']);
exit;
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
json_error('ID tidak valid.', 400);
}
$stmt = $conn->prepare("DELETE FROM lokasi_usaha WHERE id = ?");
$stmt->bind_param('i', $id);
if ($stmt->execute() && $stmt->affected_rows > 0) {
echo json_encode(['status' => 'success', 'message' => 'Data berhasil dihapus']);
} else {
echo json_encode(['status' => 'error', 'message' => 'Data tidak ditemukan atau gagal dihapus']);
if (!$stmt) {
error_log('Project 01 point delete prepare failed: ' . $conn->error);
json_error('Gagal menghapus data.', 500);
}
$stmt->close();
$conn->close();
$stmt->bind_param('i', $id);
if (!$stmt->execute()) {
error_log('Project 01 point delete failed: ' . $stmt->error);
json_error('Gagal menghapus data.', 500);
}
if ($stmt->affected_rows <= 0) {
json_error('Data tidak ditemukan.', 404);
}
json_success(['message' => 'Data berhasil dihapus']);
+32 -36
View File
@@ -1,44 +1,40 @@
<?php
// api/point/simpan.php — Simpan POI baru
header('Content-Type: application/json');
require_once '../../auth/helper.php';
require_once '../../includes/validation.php';
require_admin_post();
require_once '../../koneksi.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['status' => 'error', 'message' => 'Method not allowed']);
exit;
}
$nama = trim($_POST['nama_tempat'] ?? '');
$wa = trim($_POST['no_wa'] ?? '');
$buka24 = isset($_POST['buka_24jam']) ? (int) $_POST['buka_24jam'] : 0;
$lat = (float) ($_POST['latitude'] ?? 0);
$lng = (float) ($_POST['longitude'] ?? 0);
if (!$nama) {
echo json_encode(['status' => 'error', 'message' => 'Nama tempat tidak boleh kosong']);
exit;
$nama = clean_string($_POST['nama_tempat'] ?? '', 150);
$wa = clean_string($_POST['no_wa'] ?? '', 30);
$buka24 = (int)($_POST['buka_24jam'] ?? 0) === 1 ? 1 : 0;
$coords = validate_lat_lng($_POST['latitude'] ?? null, $_POST['longitude'] ?? null);
if ($nama === '' || $coords === null) {
json_error('Nama tempat dan koordinat valid wajib diisi.', 400);
}
[$lat, $lng] = $coords;
$stmt = $conn->prepare("INSERT INTO lokasi_usaha (nama_tempat, no_wa, buka_24jam, latitude, longitude) VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param('ssidd', $nama, $wa, $buka24, $lat, $lng);
if ($stmt->execute()) {
$id = $conn->insert_id;
echo json_encode([
'status' => 'success',
'message' => 'Data berhasil disimpan',
'data' => [
'id' => $id,
'nama_tempat' => $nama,
'no_wa' => $wa,
'buka_24jam' => $buka24,
'latitude' => $lat,
'longitude' => $lng
]
]);
} else {
echo json_encode(['status' => 'error', 'message' => 'Gagal menyimpan: ' . $stmt->error]);
if (!$stmt) {
error_log('Project 01 point insert prepare failed: ' . $conn->error);
json_error('Gagal menyimpan data.', 500);
}
$stmt->close();
$conn->close();
$stmt->bind_param('ssidd', $nama, $wa, $buka24, $lat, $lng);
if (!$stmt->execute()) {
error_log('Project 01 point insert failed: ' . $stmt->error);
json_error('Gagal menyimpan data.', 500);
}
json_success([
'message' => 'Data berhasil disimpan',
'data' => [
'id' => $conn->insert_id,
'nama_tempat' => $nama,
'no_wa' => $wa,
'buka_24jam' => $buka24,
'latitude' => $lat,
'longitude' => $lng,
],
]);
+24 -22
View File
@@ -1,30 +1,32 @@
<?php
// api/point/update_posisi.php — Update koordinat POI (drag marker)
header('Content-Type: application/json');
require_once '../../auth/helper.php';
require_once '../../includes/validation.php';
require_admin_post();
require_once '../../koneksi.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['status' => 'error', 'message' => 'Method not allowed']);
exit;
}
$id = (int) ($_POST['id'] ?? 0);
$lat = (float) ($_POST['latitude'] ?? 0);
$lng = (float) ($_POST['longitude'] ?? 0);
if (!$id) {
echo json_encode(['status' => 'error', 'message' => 'ID tidak valid']);
exit;
$id = (int)($_POST['id'] ?? 0);
$coords = validate_lat_lng($_POST['latitude'] ?? null, $_POST['longitude'] ?? null);
if ($id <= 0 || $coords === null) {
json_error('ID atau koordinat tidak valid.', 400);
}
[$lat, $lng] = $coords;
$stmt = $conn->prepare("UPDATE lokasi_usaha SET latitude = ?, longitude = ? WHERE id = ?");
$stmt->bind_param('ddi', $lat, $lng, $id);
if ($stmt->execute() && $stmt->affected_rows > 0) {
echo json_encode(['status' => 'success', 'message' => 'Posisi diperbarui']);
} else {
echo json_encode(['status' => 'error', 'message' => 'Gagal memperbarui posisi']);
if (!$stmt) {
error_log('Project 01 point position prepare failed: ' . $conn->error);
json_error('Gagal memperbarui posisi.', 500);
}
$stmt->close();
$conn->close();
$stmt->bind_param('ddi', $lat, $lng, $id);
if (!$stmt->execute()) {
error_log('Project 01 point position update failed: ' . $stmt->error);
json_error('Gagal memperbarui posisi.', 500);
}
if ($stmt->affected_rows <= 0) {
json_error('Data tidak ditemukan atau posisi tidak berubah.', 404);
}
json_success(['message' => 'Posisi diperbarui']);