Files
UasSIGWebgis/api/db.php
T
2026-06-09 18:57:05 +07:00

245 lines
11 KiB
PHP

<?php
// ==========================================
// KONFIGURASI DATABASE (Ubah saat Deployment)
// ==========================================
$db_host = getenv('DB_HOST') ?: "localhost";
$db_user = getenv('DB_USER') ?: "root";
$db_pass = getenv('DB_PASSWORD') !== false ? getenv('DB_PASSWORD') : "radit123";
$db_name = getenv('DB_DATABASE') ?: "sinergi_spasial_db"; // Database Pusat
// Matikan error expose ke frontend (Security)
mysqli_report(MYSQLI_REPORT_OFF);
$conn = new mysqli($db_host, $db_user, $db_pass);
if ($conn->connect_error) {
die("Error: Koneksi database gagal. Silakan periksa kredensial di db.php.");
}
// Buat database jika belum ada
$conn->query("CREATE DATABASE IF NOT EXISTS `$db_name`");
$conn->select_db($db_name);
// AUTO MIGRATIONS (Mencegah Error saat Deploy di Server Baru)
$queries = [
"CREATE TABLE IF NOT EXISTS warga (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(150),
jumlah_kk INT,
alamat TEXT,
latitude VARCHAR(50),
longitude VARCHAR(50),
tanggal_lahir DATE NULL,
pendidikan VARCHAR(100) NULL,
riwayat_penyakit TEXT NULL,
status_bantuan ENUM('Sudah', 'Belum') DEFAULT 'Belum',
histori_bantuan TEXT NULL
)",
"CREATE TABLE IF NOT EXISTS rumah_ibadah (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(150),
jenis VARCHAR(50) DEFAULT 'Masjid',
pic VARCHAR(100),
alamat TEXT,
latitude VARCHAR(50),
longitude VARCHAR(50)
)",
"CREATE TABLE IF NOT EXISTS pelaporan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_pelapor VARCHAR(100),
isi_laporan TEXT,
latitude VARCHAR(50),
longitude VARCHAR(50),
waktu TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)",
"CREATE TABLE IF NOT EXISTS spbu (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(150),
no_hp VARCHAR(20),
kategori ENUM('24jam', 'Tidak 24jam') DEFAULT '24jam',
latitude VARCHAR(50),
longitude VARCHAR(50)
)",
"CREATE TABLE IF NOT EXISTS jalan (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_jalan VARCHAR(150),
status_jalan ENUM('Nasional', 'Provinsi', 'Kabupaten'),
panjang_m FLOAT,
koordinat TEXT
)",
"CREATE TABLE IF NOT EXISTS parsil (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_pemilik VARCHAR(150),
status_hak ENUM('SHM', 'HGB', 'HGU', 'HP'),
koordinat TEXT
)",
"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', 'warga') DEFAULT 'warga',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)"
];
foreach ($queries as $q) {
$conn->query($q);
}
// Alter warga jika belum ada field tambahan
$cols = $conn->query("SHOW COLUMNS FROM warga LIKE 'tanggal_lahir'");
if($cols && $cols->num_rows == 0) {
$conn->query("ALTER TABLE warga ADD COLUMN tanggal_lahir DATE NULL");
$conn->query("ALTER TABLE warga ADD COLUMN pendidikan VARCHAR(100) NULL");
$conn->query("ALTER TABLE warga ADD COLUMN riwayat_penyakit TEXT NULL");
$conn->query("ALTER TABLE warga ADD COLUMN histori_bantuan TEXT NULL");
}
$cols_status = $conn->query("SHOW COLUMNS FROM warga LIKE 'status_bantuan'");
if($cols_status && $cols_status->num_rows == 0) {
$conn->query("ALTER TABLE warga ADD COLUMN status_bantuan ENUM('Sudah', 'Belum') DEFAULT 'Belum' AFTER riwayat_penyakit");
}
// Alter spbu jika menggunakan schema lama
$cols_spbu = $conn->query("SHOW COLUMNS FROM spbu LIKE 'kategori'");
if($cols_spbu && $cols_spbu->num_rows == 0) {
$conn->query("ALTER TABLE spbu CHANGE nama_spbu nama VARCHAR(150)");
$conn->query("ALTER TABLE spbu ADD COLUMN kategori ENUM('24jam', 'Tidak 24jam') DEFAULT '24jam'");
$conn->query("ALTER TABLE spbu DROP COLUMN is_24jam");
} else {
// Ubah definisi ENUM dan update data yang lama jika terlanjur menggunakan Aman/Tidak Aman
$conn->query("ALTER TABLE spbu MODIFY COLUMN kategori ENUM('Aman', 'Tidak Aman', '24jam', 'Tidak 24jam')");
$conn->query("UPDATE spbu SET kategori = '24jam' WHERE kategori = 'Aman'");
$conn->query("UPDATE spbu SET kategori = 'Tidak 24jam' WHERE kategori = 'Tidak Aman'");
$conn->query("ALTER TABLE spbu MODIFY COLUMN kategori ENUM('24jam', 'Tidak 24jam') DEFAULT '24jam'");
}
// Tambahkan kolom jenis di rumah_ibadah jika belum ada (Migration)
$check_jenis = $conn->query("SHOW COLUMNS FROM rumah_ibadah LIKE 'jenis'");
if ($check_jenis && $check_jenis->num_rows == 0) {
$conn->query("ALTER TABLE rumah_ibadah ADD COLUMN jenis VARCHAR(50) DEFAULT 'Masjid' AFTER nama");
}
// Alter users jika belum ada role
$cols_users = $conn->query("SHOW COLUMNS FROM users LIKE 'role'");
if($cols_users && $cols_users->num_rows == 0) {
$conn->query("ALTER TABLE users ADD COLUMN role ENUM('admin_infra', 'admin_sosial', 'admin', 'warga') DEFAULT 'warga' AFTER password");
} else {
// Modify ENUM if it already exists to include new roles
$conn->query("ALTER TABLE users MODIFY COLUMN role ENUM('admin_infra', 'admin_sosial', 'admin', 'warga') DEFAULT 'warga'");
}
// Seed SPBU data if empty
$check_spbu = $conn->query("SELECT COUNT(*) as count FROM spbu");
if ($check_spbu) {
$row = $check_spbu->fetch_assoc();
if ($row['count'] == 0) {
$conn->query("INSERT INTO spbu (nama, no_hp, kategori, latitude, longitude) VALUES
('SPBU Jl. Imam Bonjol', '08110000001', '24jam', '-0.0400', '109.3490'),
('SPBU Kota Baru (Prof. M. Yamin)', '08110000002', '24jam', '-0.0460', '109.3240'),
('SPBU Jl. Tanjungpura', '08110000003', '24jam', '-0.0305', '109.3444'),
('SPBU Jl. Merdeka', '08110000004', '24jam', '-0.0267', '109.3361'),
('SPBU 28 Oktober', '08110000008', '24jam', '-0.0031', '109.3667'),
('SPBU Samping Makodam', '08110000009', '24jam', '-0.0890', '109.3800'),
('SPBU Jl. A. Yani (Samping DPRD)', '08110000005', 'Tidak 24jam', '-0.0520', '109.3410'),
('SPBU RE. Martadinata', '08110000006', 'Tidak 24jam', '-0.0160', '109.3105'),
('SPBU Gusti Hamzah', '08110000007', 'Tidak 24jam', '-0.0350', '109.3225')");
}
}
// Seed Jalan data if empty
$check_jalan = $conn->query("SELECT COUNT(*) as count FROM jalan");
if ($check_jalan) {
$row = $check_jalan->fetch_assoc();
if ($row['count'] == 0) {
$jalan1 = '[{"lat":-0.0528,"lng":109.3409},{"lat":-0.0556,"lng":109.3432},{"lat":-0.0601,"lng":109.3463}]';
$jalan2 = '[{"lat":-0.0343,"lng":109.3431},{"lat":-0.0308,"lng":109.3411}]';
$conn->query("INSERT INTO jalan (nama_jalan, status_jalan, panjang_m, koordinat) VALUES
('Jl. Jenderal Ahmad Yani', 'Nasional', 1200, '$jalan1'),
('Jl. Gajah Mada', 'Provinsi', 800, '$jalan2')");
}
}
// Seed Parsil data if empty
$check_parsil = $conn->query("SELECT COUNT(*) as count FROM parsil");
if ($check_parsil) {
$row = $check_parsil->fetch_assoc();
if ($row['count'] == 0) {
$parsil1 = '[{"lat":-0.0520,"lng":109.3400},{"lat":-0.0520,"lng":109.3415},{"lat":-0.0535,"lng":109.3415},{"lat":-0.0535,"lng":109.3400}]';
$parsil2 = '[{"lat":-0.0468,"lng":109.3361},{"lat":-0.0468,"lng":109.3385},{"lat":-0.0487,"lng":109.3385},{"lat":-0.0487,"lng":109.3361}]';
$conn->query("INSERT INTO parsil (nama_pemilik, status_hak, koordinat) VALUES
('Kompleks Kantor Gubernur Kalbar', 'HP', '$parsil1'),
('Area Masjid Raya Mujahidin', 'SHM', '$parsil2')");
}
}
// Seed Masjid data if empty
$check_masjid = $conn->query("SELECT COUNT(*) as count FROM rumah_ibadah");
if ($check_masjid) {
$row = $check_masjid->fetch_assoc();
if ($row['count'] == 0) {
$conn->query("INSERT INTO rumah_ibadah (nama, jenis, pic, alamat, latitude, longitude) VALUES
('Masjid Raya Mujahidin', 'Masjid', 'Bapak Ahmad', 'Jl. Jenderal Ahmad Yani, Pontianak Selatan', '-0.0468', '109.3361'),
('Masjid Jami Keraton Kadriyah', 'Masjid', 'Bapak Syarif', 'Beting, Pontianak Timur', '-0.0215', '109.3528'),
('Masjid Darul Falah', 'Masjid', 'Bapak Budi', 'Jl. H. Rais A. Rahman', '-0.0354', '109.3242'),
('Gereja Katedral St. Yosef', 'Gereja', 'Romo Yohanes', 'Jl. Pattimura, Pontianak Kota', '-0.0385', '109.3400'),
('Vihara Bodhisatva Karaniya Metta', 'Vihara', 'Bapak Ahong', 'Jl. Kapten Marsan, Pontianak', '-0.0250', '109.3440')");
}
}
// Seed Warga data if empty
$check_warga = $conn->query("SELECT COUNT(*) as count FROM warga");
if ($check_warga) {
$row = $check_warga->fetch_assoc();
if ($row['count'] == 0) {
$conn->query("INSERT INTO warga (nama, jumlah_kk, alamat, latitude, longitude, tanggal_lahir, pendidikan, riwayat_penyakit, histori_bantuan) VALUES
('Bapak Rudi (Dekat Masjid)', 4, 'Jl. Sutoyo', '-0.0450', '109.3350', '1980-05-12', 'SMA', 'Hipertensi', 'Sembako 2025'),
('Ibu Siti (Jauh dari Fasilitas)', 3, 'Jl. Perdamaian', '-0.0650', '109.3000', '1975-08-22', 'SD', 'Asma', 'BLT 2024'),
('Bapak Ahmad (Dekat Gereja)', 5, 'Jl. Pattimura', '-0.0380', '109.3405', '1982-11-03', 'SMA', 'TBC', 'BLT 2025'),
('Ibu Aminah (Dekat Vihara)', 2, 'Jl. Kapten Marsan', '-0.0245', '109.3445', '1990-01-15', 'SMP', '', 'PKH 2026'),
('Kakek Joni (Pesisir Kapuas)', 1, 'Kawasan Pesisir', '-0.0150', '109.3300', '1955-06-30', 'Tidak Sekolah', 'Rematik', 'Raskin')");
}
}
// Seed Pelaporan data if empty
$check_pelaporan = $conn->query("SELECT COUNT(*) as count FROM pelaporan");
if ($check_pelaporan) {
$row = $check_pelaporan->fetch_assoc();
if ($row['count'] == 0) {
$conn->query("INSERT INTO pelaporan (nama_pelapor, isi_laporan, latitude, longitude) VALUES
('Pak Udin', 'Banjir parah air masuk ke rumah warga hingga lutut', '-0.0500', '109.3200'),
('Ibu Rina', 'Warga lansia sakit parah butuh ambulans darurat', '-0.0400', '109.3350'),
('Anonim', 'Jalanan ambles membahayakan pengendara', '-0.0250', '109.3600')");
}
}
// Pastikan akun admin_infra ada
$check_infra = $conn->query("SELECT * FROM users WHERE username='admin_infra'");
if ($check_infra && $check_infra->num_rows == 0) {
$pw = password_hash('infra123', PASSWORD_DEFAULT);
$conn->query("INSERT INTO users (username, password, role) VALUES ('admin_infra', '$pw', 'admin_infra')");
}
// Pastikan akun admin_sosial ada
$check_sosial = $conn->query("SELECT * FROM users WHERE username='admin_sosial'");
if ($check_sosial && $check_sosial->num_rows == 0) {
$pw = password_hash('sosial123', PASSWORD_DEFAULT);
$conn->query("INSERT INTO users (username, password, role) VALUES ('admin_sosial', '$pw', 'admin_sosial')");
}
// Pastikan akun admin (Superadmin lama) ada
$check_admin = $conn->query("SELECT * FROM users WHERE username='admin'");
if ($check_admin && $check_admin->num_rows == 0) {
$default_password = password_hash('admin123', PASSWORD_DEFAULT);
$conn->query("INSERT INTO users (username, password, role) VALUES ('admin', '$default_password', 'admin')");
} else {
$conn->query("UPDATE users SET role='admin' WHERE username='admin' AND role='warga'");
}
// Pastikan akun warga ada
$check_warga = $conn->query("SELECT * FROM users WHERE username='warga'");
if ($check_warga && $check_warga->num_rows == 0) {
$warga_password = password_hash('warga123', PASSWORD_DEFAULT);
$conn->query("INSERT INTO users (username, password, role) VALUES ('warga', '$warga_password', 'warga')");
}
?>