chore: prepare docker webgis deployment

This commit is contained in:
Andrie
2026-06-11 18:14:21 +07:00
parent d2214ad9c8
commit a90748d9c1
149 changed files with 20844 additions and 5 deletions
+29
View File
@@ -0,0 +1,29 @@
<?php
require_once '../../koneksi.php';
header('Content-Type: application/json');
$result = $conn->query(
"SELECT id, nama, deskripsi, attribute_key, palette, is_visible, created_at
FROM choropleth_layers ORDER BY created_at ASC"
);
if ($result === false) {
echo json_encode(['status' => 'error', 'message' => 'Tabel belum ada. Jalankan setup_database.sql terlebih dahulu. (' . $conn->error . ')']);
$conn->close(); exit;
}
$rows = [];
while ($r = $result->fetch_assoc()) {
$rows[] = [
'id' => (int)$r['id'],
'nama' => $r['nama'],
'deskripsi' => $r['deskripsi'],
'attribute_key' => $r['attribute_key'],
'palette' => $r['palette'],
'is_visible' => (bool)$r['is_visible'],
'created_at' => $r['created_at'],
];
}
$conn->close();
echo json_encode(['status' => 'success', 'data' => $rows, 'total' => count($rows)]);
+22
View File
@@ -0,0 +1,22 @@
<?php
require_once '../../koneksi.php';
header('Content-Type: application/json');
$id = (int)($_GET['id'] ?? 0);
if ($id <= 0) {
echo json_encode(['status' => 'error', 'message' => 'ID tidak valid.']); exit;
}
$stmt = $conn->prepare("SELECT geojson FROM choropleth_layers WHERE id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$row = $stmt->get_result()->fetch_assoc();
$stmt->close();
$conn->close();
if (!$row) {
http_response_code(404);
echo json_encode(['status' => 'error', 'message' => 'Layer tidak ditemukan.']); exit;
}
echo $row['geojson'];
+26
View File
@@ -0,0 +1,26 @@
<?php
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;
}
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
echo json_encode(['status' => 'error', 'message' => 'ID tidak valid.']); exit;
}
$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;
}
echo json_encode(['status' => 'success']);
+27
View File
@@ -0,0 +1,27 @@
<?php
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;
}
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
echo json_encode(['status' => 'error', 'message' => 'ID tidak valid.']); exit;
}
$stmt = $conn->prepare("UPDATE choropleth_layers SET is_visible = 1 - is_visible WHERE id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
$stmt2 = $conn->prepare("SELECT is_visible FROM choropleth_layers WHERE id = ?");
$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']]);
+54
View File
@@ -0,0 +1,54 @@
<?php
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 = 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 (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;
}
if ($_FILES['geojson']['size'] > 10 * 1024 * 1024) {
echo json_encode(['status' => 'error', 'message' => 'File terlalu besar (maksimum 10 MB).']); exit;
}
$raw = file_get_contents($_FILES['geojson']['tmp_name']);
if ($raw === false) {
echo json_encode(['status' => 'error', 'message' => 'Gagal membaca file.']); exit;
}
$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;
}
$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();
echo json_encode(['status' => 'success', 'id' => $id, 'nama' => $nama]);