feat: memisahkan monorepo jadi 2 project (Kemiskinan & Publik)

This commit is contained in:
2026-06-11 14:38:22 +07:00
parent 4cbbd3c718
commit d77596f62b
48 changed files with 7277 additions and 36 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1024
View File
File diff suppressed because it is too large Load Diff
+22
View File
@@ -0,0 +1,22 @@
<?php
session_start();
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('Content-Type: application/json');
http_response_code(403);
echo json_encode(['status'=>'error','message'=>'Akses ditolak. Hanya admin yang dapat menghapus data.']);
exit;
}
include '../koneksi.php';
header('Content-Type: application/json');
$id = (int)($_POST['id'] ?? $_GET['id'] ?? 0);
if (!$id) { echo json_encode(['status'=>'error','message'=>'ID tidak valid.']); exit; }
try {
$pdo->prepare("DELETE FROM jalan WHERE id=?")->execute([$id]);
echo json_encode(['status'=>'success']);
} catch (PDOException $e) {
echo json_encode(['status'=>'error','message'=>$e->getMessage()]);
}
?>
+51
View File
@@ -0,0 +1,51 @@
<?php
session_start();
if (!isset($_SESSION['role']) || !in_array($_SESSION['role'], ['admin', 'petugas'])) {
header('Content-Type: application/json');
http_response_code(403);
echo json_encode(['status'=>'error','message'=>'Akses ditolak.']);
exit;
}
include '../koneksi.php';
header('Content-Type: application/json');
$nama_jalan = trim($_POST['nama_jalan'] ?? '');
$status_jalan = trim($_POST['status_jalan'] ?? '');
$panjang_meter = trim($_POST['panjang_meter'] ?? '0');
$koordinat = trim($_POST['koordinat'] ?? '');
if (!$nama_jalan || !$status_jalan || !$koordinat) {
echo json_encode(['status'=>'error','message'=>'Field wajib tidak boleh kosong.']);
exit;
}
$decoded = json_decode($koordinat, true);
if (!$decoded || ($decoded['geometry']['type'] ?? '') !== 'LineString') {
echo json_encode(['status'=>'error','message'=>'Format GeoJSON tidak valid.']);
exit;
}
$valid_status = ['Jalan Nasional','Jalan Provinsi','Jalan Kabupaten'];
if (!in_array($status_jalan, $valid_status)) {
echo json_encode(['status'=>'error','message'=>'Status jalan tidak valid.']);
exit;
}
try {
$stmt = $pdo->prepare(
"INSERT INTO jalan (nama_jalan, status_jalan, panjang_meter, koordinat)
VALUES (?, ?, ?, ?)"
);
$stmt->execute([$nama_jalan, $status_jalan, $panjang_meter, $koordinat]);
$id = $pdo->lastInsertId();
$stmtSelect = $pdo->prepare("SELECT * FROM jalan WHERE id=?");
$stmtSelect->execute([$id]);
$data = $stmtSelect->fetch(PDO::FETCH_ASSOC);
echo json_encode(['status'=>'success','data'=>$data]);
} catch (PDOException $e) {
echo json_encode(['status'=>'error','message'=>$e->getMessage()]);
}
?>
+75
View File
@@ -0,0 +1,75 @@
<?php
// ============================================================
// koneksi.php — Database Connection (PDO)
// ============================================================
define('DB_HOST', getenv('DB_HOST') ?: 'localhost');
define('DB_USER', getenv('DB_USER') ?: 'root');
define('DB_PASS', getenv('DB_PASS') !== false ? getenv('DB_PASS') : '');
define('DB_NAME', getenv('DB_NAME') ?: 'webgis');
define('DB_CHARSET', 'utf8mb4');
$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET;
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, DB_USER, DB_PASS, $options);
// ============================================================
// AUTO-MIGRATION SCRIPT (Sesuai Permintaan)
// ============================================================
// 1. Buat tabel users jika belum ada (fallback)
$pdo->exec("CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
role ENUM('admin','petugas','guest') NOT NULL DEFAULT 'guest',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB");
// 2. Cek dan tambahkan kolom baru pada tabel users
$columns = $pdo->query("SHOW COLUMNS FROM users")->fetchAll(PDO::FETCH_COLUMN);
if (!in_array('email', $columns)) {
$pdo->exec("ALTER TABLE users ADD COLUMN email VARCHAR(150) UNIQUE NULL AFTER username");
}
if (!in_array('nama_lengkap', $columns)) {
$pdo->exec("ALTER TABLE users ADD COLUMN nama_lengkap VARCHAR(150) NULL AFTER email");
}
if (!in_array('status', $columns)) {
// Update user lama menjadi active terlebih dahulu jika diperlukan, tapi defaultnya active
$pdo->exec("ALTER TABLE users ADD COLUMN status ENUM('pending', 'active') NOT NULL DEFAULT 'active' AFTER role");
}
if (!in_array('auth_provider', $columns)) {
$pdo->exec("ALTER TABLE users ADD COLUMN auth_provider ENUM('local', 'google') NOT NULL DEFAULT 'local' AFTER status");
}
// 3. Buat tabel settings
$pdo->exec("CREATE TABLE IF NOT EXISTS settings (
setting_key VARCHAR(50) PRIMARY KEY,
setting_value VARCHAR(255) NOT NULL
) ENGINE=InnoDB");
// 4. Masukkan data default settings jika belum ada
$pdo->exec("INSERT IGNORE INTO settings (setting_key, setting_value) VALUES ('show_demo_accounts', '1')");
} catch (PDOException $e) {
http_response_code(500);
die(json_encode([
'status' => 'error',
'message' => 'Koneksi database gagal: ' . $e->getMessage()
]));
}
// Legacy mysqli compatibility (untuk file yang masih menggunakannya)
$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($conn) {
mysqli_set_charset($conn, DB_CHARSET);
}
?>
+23
View File
@@ -0,0 +1,23 @@
<?php
session_start();
// Role check: hanya admin yang boleh menghapus
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('Content-Type: application/json');
http_response_code(403);
echo json_encode(['status'=>'error','message'=>'Akses ditolak. Hanya admin yang dapat menghapus data.']);
exit;
}
include '../koneksi.php';
header('Content-Type: application/json');
$id = (int)($_POST['id'] ?? $_GET['id'] ?? 0);
if (!$id) { echo json_encode(['status'=>'error','message'=>'ID tidak valid.']); exit; }
try {
$pdo->prepare("DELETE FROM points WHERE id=?")->execute([$id]);
echo json_encode(['status'=>'success']);
} catch (PDOException $e) {
echo json_encode(['status'=>'error','message'=>$e->getMessage()]);
}
?>
+47
View File
@@ -0,0 +1,47 @@
<?php
session_start();
// Role check: hanya admin dan petugas yang boleh menyimpan
if (!isset($_SESSION['role']) || !in_array($_SESSION['role'], ['admin', 'petugas'])) {
header('Content-Type: application/json');
http_response_code(403);
echo json_encode(['status'=>'error','message'=>'Akses ditolak. Hanya admin/petugas yang dapat menambah data.']);
exit;
}
// point/simpan.php
include '../koneksi.php';
header('Content-Type: application/json');
$nama = trim($_POST['nama'] ?? '');
$no_wa = trim($_POST['no_wa'] ?? '');
$buka_24 = trim($_POST['buka_24_jam']?? '');
$latitude = trim($_POST['latitude'] ?? '');
$longitude = trim($_POST['longitude'] ?? '');
if (!$nama || !$no_wa || !$buka_24 || !$latitude || !$longitude) {
echo json_encode(['status'=>'error','message'=>'Semua field wajib diisi.']);
exit;
}
if (!in_array($buka_24, ['Ya','Tidak'])) {
echo json_encode(['status'=>'error','message'=>'Nilai buka_24_jam tidak valid.']);
exit;
}
try {
$stmt = $pdo->prepare(
"INSERT INTO points (nama, no_wa, buka_24_jam, latitude, longitude)
VALUES (?, ?, ?, ?, ?)"
);
$stmt->execute([$nama, $no_wa, $buka_24, $latitude, $longitude]);
$id = $pdo->lastInsertId();
$stmtSelect = $pdo->prepare("SELECT * FROM points WHERE id = ?");
$stmtSelect->execute([$id]);
$data = $stmtSelect->fetch(PDO::FETCH_ASSOC);
echo json_encode(['status'=>'success','data'=>$data]);
} catch (PDOException $e) {
echo json_encode(['status'=>'error','message'=>'Gagal menyimpan: '.$e->getMessage()]);
}
?>
+39
View File
@@ -0,0 +1,39 @@
<?php
session_start();
if (!isset($_SESSION['role']) || !in_array($_SESSION['role'], ['admin', 'petugas'])) {
header('Content-Type: application/json');
http_response_code(403);
echo json_encode(['status'=>'error','message'=>'Akses ditolak.']);
exit;
}
include '../koneksi.php';
header('Content-Type: application/json');
$id = (int)($_POST['id'] ?? 0);
$nama = trim($_POST['nama'] ?? '');
$no_wa = trim($_POST['no_wa'] ?? '');
$buka_24 = trim($_POST['buka_24_jam'] ?? '');
$latitude = trim($_POST['latitude'] ?? '');
$longitude = trim($_POST['longitude'] ?? '');
if (!$id || !$nama || !$no_wa || !$buka_24 || !$latitude || !$longitude) {
echo json_encode(['status'=>'error','message'=>'Data tidak lengkap.']);
exit;
}
try {
$stmt = $pdo->prepare(
"UPDATE points SET nama=?, no_wa=?, buka_24_jam=?, latitude=?, longitude=? WHERE id=?"
);
$stmt->execute([$nama, $no_wa, $buka_24, $latitude, $longitude, $id]);
$stmtSelect = $pdo->prepare("SELECT * FROM points WHERE id=?");
$stmtSelect->execute([$id]);
$data = $stmtSelect->fetch(PDO::FETCH_ASSOC);
echo json_encode(['status'=>'success','data'=>$data]);
} catch (PDOException $e) {
echo json_encode(['status'=>'error','message'=>$e->getMessage()]);
}
?>
+26
View File
@@ -0,0 +1,26 @@
<?php
session_start();
include '../koneksi.php';
if (!isset($_SESSION['user_id'])) {
echo json_encode(['status' => 'error', 'message' => 'Unauthorized']);
exit;
}
$id = $_POST['id'] ?? '';
$latitude = $_POST['latitude'] ?? '';
$longitude = $_POST['longitude'] ?? '';
if (!$id || !$latitude || !$longitude) {
echo json_encode(['status' => 'error', 'message' => 'Data tidak lengkap']);
exit;
}
try {
$stmt = $pdo->prepare("UPDATE points SET latitude = ?, longitude = ? WHERE id = ?");
$stmt->execute([$latitude, $longitude, $id]);
echo json_encode(['status' => 'success']);
} catch (PDOException $e) {
echo json_encode(['status' => 'error', 'message' => 'Database error']);
}
+22
View File
@@ -0,0 +1,22 @@
<?php
session_start();
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('Content-Type: application/json');
http_response_code(403);
echo json_encode(['status'=>'error','message'=>'Akses ditolak. Hanya admin yang dapat menghapus data.']);
exit;
}
include '../koneksi.php';
header('Content-Type: application/json');
$id = (int)($_POST['id'] ?? $_GET['id'] ?? 0);
if (!$id) { echo json_encode(['status'=>'error','message'=>'ID tidak valid.']); exit; }
try {
$pdo->prepare("DELETE FROM polygon WHERE id=?")->execute([$id]);
echo json_encode(['status'=>'success']);
} catch (PDOException $e) {
echo json_encode(['status'=>'error','message'=>$e->getMessage()]);
}
?>
+51
View File
@@ -0,0 +1,51 @@
<?php
session_start();
if (!isset($_SESSION['role']) || !in_array($_SESSION['role'], ['admin', 'petugas'])) {
header('Content-Type: application/json');
http_response_code(403);
echo json_encode(['status'=>'error','message'=>'Akses ditolak.']);
exit;
}
include '../koneksi.php';
header('Content-Type: application/json');
$nama_parsil = trim($_POST['nama_parsil'] ?? '');
$status_kepemilikan= trim($_POST['status_kepemilikan']?? '');
$luas_tanah = trim($_POST['luas_tanah'] ?? '0');
$koordinat = trim($_POST['koordinat'] ?? '');
if (!$nama_parsil || !$status_kepemilikan || !$koordinat) {
echo json_encode(['status'=>'error','message'=>'Field wajib tidak boleh kosong.']);
exit;
}
$decoded = json_decode($koordinat, true);
if (!$decoded || ($decoded['geometry']['type'] ?? '') !== 'Polygon') {
echo json_encode(['status'=>'error','message'=>'Format GeoJSON tidak valid.']);
exit;
}
$valid_status = ['SHM','HGB','HGU','HP'];
if (!in_array($status_kepemilikan, $valid_status)) {
echo json_encode(['status'=>'error','message'=>'Status kepemilikan tidak valid.']);
exit;
}
try {
$stmt = $pdo->prepare(
"INSERT INTO polygon (nama_parsil, status_kepemilikan, luas_tanah, koordinat)
VALUES (?, ?, ?, ?)"
);
$stmt->execute([$nama_parsil, $status_kepemilikan, $luas_tanah, $koordinat]);
$id = $pdo->lastInsertId();
$stmtSelect = $pdo->prepare("SELECT * FROM polygon WHERE id=?");
$stmtSelect->execute([$id]);
$data = $stmtSelect->fetch(PDO::FETCH_ASSOC);
echo json_encode(['status'=>'success','data'=>$data]);
} catch (PDOException $e) {
echo json_encode(['status'=>'error','message'=>$e->getMessage()]);
}
?>
+1
View File
@@ -0,0 +1 @@
# Gitkeep
Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB