diff --git a/05/auth.php b/05/auth.php index 2cb27a4..d3a6f3a 100644 --- a/05/auth.php +++ b/05/auth.php @@ -12,7 +12,7 @@ if ($aksi === 'login') { $email = trim($_POST['email'] ?? ''); $password = $_POST['password'] ?? ''; if (!$email || !$password) json_out(['error'=>'Email dan password wajib diisi'],400); - $stmt = $conn->prepare("SELECT u.*,r.nama AS role_nama FROM user u JOIN role r ON u.role_id=r.id WHERE u.email=? AND u.aktif=1 LIMIT 1"); + $stmt = $conn->prepare("SELECT u.*,r.nama AS role_nama FROM `user` u JOIN `role` r ON u.role_id=r.id WHERE u.email=? AND u.aktif=1 LIMIT 1"); if (!$stmt) { json_out(['error' => 'Database error: ' . $conn->error], 500); } diff --git a/05/bantuan.php b/05/bantuan.php index a919f7b..47b0e86 100644 --- a/05/bantuan.php +++ b/05/bantuan.php @@ -52,7 +52,7 @@ if ($aksi === 'histori') { FROM histori_bantuan hb JOIN bantuan b ON hb.bantuan_id=b.id JOIN penduduk p ON hb.penduduk_id=p.id - LEFT JOIN user u ON hb.disalurkan_oleh=u.id + LEFT JOIN `user` u ON hb.disalurkan_oleh=u.id WHERE $w ORDER BY hb.tanggal DESC,hb.id DESC"; if($params){$stmt=$conn->prepare($sql);$stmt->bind_param($types,...$params);$stmt->execute();$res=$stmt->get_result();$stmt->close();} else $res=$conn->query($sql); diff --git a/05/chat.php b/05/chat.php index 0122782..bae471f 100644 --- a/05/chat.php +++ b/05/chat.php @@ -11,7 +11,7 @@ if ($aksi === 'inbox') { if(!$uid) json_out([]); $sql="SELECT p.*,u.nama AS nama_pengirim FROM pesan p - JOIN user u ON p.dari_user=u.id + JOIN `user` u ON p.dari_user=u.id WHERE (p.ke_user=$uid OR p.ke_user IS NULL) ORDER BY p.created_at DESC LIMIT 80"; $res=$conn->query($sql); $rows=[]; @@ -23,7 +23,7 @@ if ($aksi === 'inbox') { if ($aksi === 'history') { $ke=(int)($_GET['ke']??0); - $res=$conn->query("SELECT p.*,u.nama AS nama_pengirim FROM pesan p JOIN user u ON p.dari_user=u.id WHERE (p.dari_user=$uid AND p.ke_user=$ke) OR (p.dari_user=$ke AND p.ke_user=$uid) ORDER BY p.created_at ASC LIMIT 100"); + $res=$conn->query("SELECT p.*,u.nama AS nama_pengirim FROM pesan p JOIN `user` u ON p.dari_user=u.id WHERE (p.dari_user=$uid AND p.ke_user=$ke) OR (p.dari_user=$ke AND p.ke_user=$uid) ORDER BY p.created_at ASC LIMIT 100"); $rows=[]; if($res) while($r=$res->fetch_assoc()) $rows[]=$r; json_out($rows); } @@ -39,7 +39,7 @@ if ($aksi === 'kirim') { } if ($aksi === 'kontak') { - $res=$conn->query("SELECT u.id,u.nama,r.nama AS role FROM user u JOIN role r ON u.role_id=r.id WHERE u.aktif=1".($uid?" AND u.id!=$uid":'')." ORDER BY u.nama"); + $res=$conn->query("SELECT u.id,u.nama,r.nama AS role FROM `user` u JOIN `role` r ON u.role_id=r.id WHERE u.aktif=1".($uid?" AND u.id!=$uid":'')." ORDER BY u.nama"); $rows=[]; if($res) while($r=$res->fetch_assoc()) $rows[]=$r; json_out($rows); } diff --git a/05/dashboard.php b/05/dashboard.php index 385b979..748a20d 100644 --- a/05/dashboard.php +++ b/05/dashboard.php @@ -32,7 +32,7 @@ $prioritas=[]; $res=$conn->query("SELECT p.id,p.nik,p.nama,p.status_ekonomi,TIME if($res) while($r=$res->fetch_assoc()) $prioritas[]=$r; // aktivitas -$aktivitas=[]; $res=$conn->query("SELECT la.*,u.nama AS nama_user FROM log_aktivitas la LEFT JOIN user u ON la.user_id=u.id ORDER BY la.created_at DESC LIMIT 15"); +$aktivitas=[]; $res=$conn->query("SELECT la.*,u.nama AS nama_user FROM log_aktivitas la LEFT JOIN `user` u ON la.user_id=u.id ORDER BY la.created_at DESC LIMIT 15"); if($res) while($r=$res->fetch_assoc()) $aktivitas[]=$r; json_out([ diff --git a/05/laporan.php b/05/laporan.php index 11deab8..5503194 100644 --- a/05/laporan.php +++ b/05/laporan.php @@ -18,7 +18,7 @@ if ($aksi === 'list') { $sql="SELECT l.*,p.nama AS nama_penduduk,p.status_ekonomi,p.nik,u.nama AS nama_verifikator FROM laporan l LEFT JOIN penduduk p ON l.penduduk_id=p.id - LEFT JOIN user u ON l.diverifikasi_oleh=u.id + LEFT JOIN `user` u ON l.diverifikasi_oleh=u.id WHERE $w ORDER BY FIELD(l.urgensi,'darurat','tinggi','sedang','rendah'),l.created_at DESC"; $res=$conn->query($sql); @@ -29,7 +29,7 @@ if ($aksi === 'list') { if ($aksi === 'detail') { $id=(int)($_GET['id']??0); - $res=$conn->query("SELECT l.*,p.nama AS nama_penduduk,u.nama AS nama_verifikator FROM laporan l LEFT JOIN penduduk p ON l.penduduk_id=p.id LEFT JOIN user u ON l.diverifikasi_oleh=u.id WHERE l.id=$id LIMIT 1"); + $res=$conn->query("SELECT l.*,p.nama AS nama_penduduk,u.nama AS nama_verifikator FROM laporan l LEFT JOIN penduduk p ON l.penduduk_id=p.id LEFT JOIN `user` u ON l.diverifikasi_oleh=u.id WHERE l.id=$id LIMIT 1"); json_out($res->fetch_assoc()??['error'=>'Tidak ditemukan']); } diff --git a/05/user.php b/05/user.php index bb9096c..85d9012 100644 --- a/05/user.php +++ b/05/user.php @@ -7,7 +7,7 @@ include 'koneksi.php'; $aksi = $_REQUEST['aksi'] ?? 'list'; if ($aksi === 'list') { - $res=$conn->query("SELECT u.id,u.nama,u.email,u.aktif,u.created_at,r.nama AS role_nama,r.id AS role_id FROM user u JOIN role r ON u.role_id=r.id ORDER BY u.nama"); + $res=$conn->query("SELECT u.id,u.nama,u.email,u.aktif,u.created_at,r.nama AS role_nama,r.id AS role_id FROM `user` u JOIN `role` r ON u.role_id=r.id ORDER BY u.nama"); if(!$res) json_out(['error'=>$conn->error],500); $rows=[]; while($r=$res->fetch_assoc()) $rows[]=$r; json_out($rows); @@ -18,9 +18,9 @@ if ($aksi === 'simpan') { $em=$conn->real_escape_string($_POST['email']??''); $pw=password_hash($_POST['password']??'password',PASSWORD_DEFAULT); $rid=(int)($_POST['role_id']??1); - $cek=$conn->query("SELECT id FROM user WHERE email='$em'")->num_rows; + $cek=$conn->query("SELECT id FROM `user` WHERE email='$em'")->num_rows; if($cek>0) json_out(['error'=>'Email sudah digunakan'],400); - $conn->query("INSERT INTO user (nama,email,password,role_id) VALUES ('$nm','$em','$pw',$rid)"); + $conn->query("INSERT INTO `user` (nama,email,password,role_id) VALUES ('$nm','$em','$pw',$rid)"); if($conn->error) json_out(['error'=>$conn->error],500); json_out(['success'=>true,'id'=>$conn->insert_id]); } @@ -31,22 +31,22 @@ if ($aksi === 'edit') { $em=$conn->real_escape_string($_POST['email']??''); $rid=(int)($_POST['role_id']??1); $akt=(int)($_POST['aktif']??1); - $conn->query("UPDATE user SET nama='$nm',email='$em',role_id=$rid,aktif=$akt WHERE id=$id"); + $conn->query("UPDATE `user` SET nama='$nm',email='$em',role_id=$rid,aktif=$akt WHERE id=$id"); if(!empty($_POST['password'])){ $pw=password_hash($_POST['password'],PASSWORD_DEFAULT); - $conn->query("UPDATE user SET password='$pw' WHERE id=$id"); + $conn->query("UPDATE `user` SET password='$pw' WHERE id=$id"); } json_out(['success'=>true]); } if ($aksi === 'hapus') { $id=(int)($_POST['id']??0); - $conn->query("DELETE FROM user WHERE id=$id"); + $conn->query("DELETE FROM `user` WHERE id=$id"); json_out(['success'=>true]); } if ($aksi === 'roles') { - $res=$conn->query("SELECT * FROM role"); $rows=[]; + $res=$conn->query("SELECT * FROM `role`"); $rows=[]; while($r=$res->fetch_assoc()) $rows[]=$r; json_out($rows); } diff --git a/docker-compose.yml b/docker-compose.yml index dbe1912..fa4ce7a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,6 +5,8 @@ services: dockerfile: Dockerfile expose: - "80" + volumes: + - app_uploads:/var/www/html/05/uploads environment: DB_HOST: db DB_PORT: 3306 @@ -47,13 +49,7 @@ services: echo 'Waiting for database...'; sleep 2; done; - sleep 3; - echo 'mysqld is alive'; - for file in /docker-entrypoint-initdb.d/*.sql; do - echo \"Running $$file\"; - mysql -h db -uroot --password=$$MYSQL_PWD < $$file || exit 1; - done; - echo 'All migrations done.'; + echo 'Database is ready, all internal migrations done.'; " restart: "no" @@ -70,3 +66,4 @@ services: volumes: webgis_db_data: + app_uploads: diff --git a/migrations/init.sql b/migrations/init.sql index da47e7f..2162ebc 100644 --- a/migrations/init.sql +++ b/migrations/init.sql @@ -1,4 +1,4 @@ - + -- ============================================================ -- Bawaan 05 -- ============================================================ @@ -26,19 +26,19 @@ DROP TABLE IF EXISTS `role`; SET FOREIGN_KEY_CHECKS = 1; -- ── 1. ROLE ───────────────────────────────────────────────── -CREATE TABLE role ( +CREATE TABLE `role` ( id INT AUTO_INCREMENT PRIMARY KEY, nama VARCHAR(50) NOT NULL, deskripsi TEXT ) ENGINE=InnoDB; -INSERT INTO role (nama, deskripsi) VALUES +INSERT INTO `role` (nama, deskripsi) VALUES ('masyarakat', 'Hanya dapat melihat data dan membuat laporan'), ('pengurus', 'Input & update data penduduk, verifikasi laporan, salurkan bantuan'), ('pimpinan', 'Read-only, monitoring dashboard'); -- ── 2. USER ───────────────────────────────────────────────── -CREATE TABLE user ( +CREATE TABLE `user` ( id INT AUTO_INCREMENT PRIMARY KEY, nama VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, @@ -46,11 +46,11 @@ CREATE TABLE user ( role_id INT NOT NULL DEFAULT 1, aktif TINYINT(1) DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (role_id) REFERENCES role(id) + FOREIGN KEY (role_id) REFERENCES `role`(id) ) ENGINE=InnoDB; -- Password untuk semua akun demo: "password" -INSERT INTO user (nama, email, password, role_id) VALUES +INSERT INTO `user` (nama, email, password, role_id) VALUES ('Admin Utama', 'admin@uas.id', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 2), ('Pimpinan Daerah', 'pimpinan@uas.id', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 3), ('Warga Biasa', 'warga@uas.id', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 1), @@ -68,7 +68,7 @@ CREATE TABLE rumah_ibadah ( radius DOUBLE DEFAULT 500, user_id INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE SET NULL + FOREIGN KEY (user_id) REFERENCES `user`(id) ON DELETE SET NULL ) ENGINE=InnoDB; INSERT INTO rumah_ibadah (nama, jenis, kontak, alamat, lat, lng, radius, user_id) VALUES @@ -190,7 +190,7 @@ CREATE TABLE histori_bantuan ( created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (penduduk_id) REFERENCES penduduk(id) ON DELETE CASCADE, FOREIGN KEY (bantuan_id) REFERENCES bantuan(id) ON DELETE CASCADE, - FOREIGN KEY (disalurkan_oleh) REFERENCES user(id) ON DELETE SET NULL + FOREIGN KEY (disalurkan_oleh) REFERENCES `user`(id) ON DELETE SET NULL ) ENGINE=InnoDB; INSERT INTO histori_bantuan (penduduk_id,bantuan_id,tanggal,jumlah,status,disalurkan_oleh,keterangan) VALUES @@ -217,7 +217,7 @@ CREATE TABLE laporan ( created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (penduduk_id) REFERENCES penduduk(id) ON DELETE SET NULL, - FOREIGN KEY (diverifikasi_oleh) REFERENCES user(id) ON DELETE SET NULL + FOREIGN KEY (diverifikasi_oleh) REFERENCES `user`(id) ON DELETE SET NULL ) ENGINE=InnoDB; INSERT INTO laporan (pelapor,penduduk_id,deskripsi,lat,lng,urgensi,status) VALUES @@ -237,7 +237,7 @@ CREATE TABLE log_aktivitas ( keterangan TEXT, ip_address VARCHAR(45), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE SET NULL + FOREIGN KEY (user_id) REFERENCES `user`(id) ON DELETE SET NULL ) ENGINE=InnoDB; INSERT INTO log_aktivitas (user_id,aksi,tabel,data_id,keterangan) VALUES @@ -254,8 +254,8 @@ CREATE TABLE pesan ( isi TEXT NOT NULL, dibaca TINYINT(1) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (dari_user) REFERENCES user(id) ON DELETE CASCADE, - FOREIGN KEY (ke_user) REFERENCES user(id) ON DELETE SET NULL + FOREIGN KEY (dari_user) REFERENCES `user`(id) ON DELETE CASCADE, + FOREIGN KEY (ke_user) REFERENCES `user`(id) ON DELETE SET NULL ) ENGINE=InnoDB; INSERT INTO pesan (dari_user,ke_user,isi,dibaca) VALUES @@ -299,7 +299,7 @@ CREATE TABLE jalan( nama_jalan VARCHAR(150), status VARCHAR(50), panjang DOUBLE, - geom LINESTRING NOT NULL, + geom LINESTRING NOT NULL SRID 0, SPATIAL INDEX idx_jalan(geom) ); @@ -308,7 +308,7 @@ CREATE TABLE parsil( pemilik VARCHAR(100), status VARCHAR(50), luas DOUBLE, - geom POLYGON NOT NULL, + geom POLYGON NOT NULL SRID 0, SPATIAL INDEX idx_parsil(geom) ); @@ -316,7 +316,7 @@ CREATE TABLE jalan_rusak( id INT AUTO_INCREMENT PRIMARY KEY, nama_titik VARCHAR(100), keterangan TEXT, - geom POINT NOT NULL, + geom POINT NOT NULL SRID 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, SPATIAL INDEX idx_rusak(geom) );