Compare commits
11 Commits
e3397a7484
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 8501c80ad6 | |||
| 42e8cb5877 | |||
| 75ca042f40 | |||
| 0ed839896c | |||
| 01df8e6b53 | |||
| 9ad63c2389 | |||
| e28728c0ed | |||
| 05f18aeab1 | |||
| d3d263d6d5 | |||
| d6bed6618c | |||
| 29424f45f9 |
@@ -11,6 +11,12 @@ start_session();
|
||||
mysqli_report(MYSQLI_REPORT_OFF);
|
||||
$conn = @new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);
|
||||
|
||||
if ($conn->connect_error && DB_USER !== (getenv('DB_USER') ?: 'root')) {
|
||||
$fallback_user = getenv('DB_USER') ?: 'root';
|
||||
$fallback_pass = getenv('DB_PASS') ?: '';
|
||||
$conn = @new mysqli(DB_HOST, $fallback_user, $fallback_pass, DB_NAME, DB_PORT);
|
||||
}
|
||||
|
||||
if ($conn->connect_error) {
|
||||
http_response_code(500);
|
||||
error_log('Project 01 database connection failed: ' . $conn->connect_error);
|
||||
|
||||
@@ -17,7 +17,7 @@ define('MAX_LOGIN_ATTEMPTS', 5);
|
||||
define('LOCKOUT_MINUTES', 15);
|
||||
|
||||
define('DB_HOST', getenv('DB_HOST') ?: 'localhost');
|
||||
define('DB_USER', getenv('DB_USER') ?: 'root');
|
||||
define('DB_PASS', getenv('DB_PASS') ?: '');
|
||||
define('DB_USER', getenv('APP_DB_USER') ?: (getenv('DB_USER') ?: 'root'));
|
||||
define('DB_PASS', getenv('APP_DB_PASSWORD') ?: (getenv('DB_PASS') ?: ''));
|
||||
define('DB_NAME', getenv('DB_WEBGIS_NAME') ?: (getenv('DB_NAME') ?: 'db_webgis'));
|
||||
define('DB_PORT', (int)(getenv('DB_PORT') ?: 3307));
|
||||
|
||||
@@ -2793,6 +2793,29 @@ $map_module_urls = array_map(function ($module) {
|
||||
<span class="dl-header-count" id="dlCountPenduduk">0</span>
|
||||
<span class="dl-chevron"><i data-lucide="chevron-down"></i></span>
|
||||
</div>
|
||||
<?php if ($is_admin || $is_op): ?>
|
||||
<div class="dl-filter-container" style="padding: 8px 12px; border-bottom: 1px solid var(--c-border); display: flex; flex-direction: column; gap: 8px;">
|
||||
<div class="dl-filter-row" style="display: flex; gap: 8px; flex-wrap: wrap;">
|
||||
<?php if ($is_admin || $is_op): ?>
|
||||
<label class="layer-chip" title="Sembunyikan warga terjangkau (hijau)">
|
||||
<input type="checkbox" id="chkTerjangkau" checked onchange="window._setPendudukSubLayerVisible && window._setPendudukSubLayerVisible('terjangkau', this.checked)"> Warga Terjangkau
|
||||
</label>
|
||||
<label class="layer-chip" title="Sembunyikan warga blank spot (merah)">
|
||||
<input type="checkbox" id="chkBlankspot" checked onchange="window._setPendudukSubLayerVisible && window._setPendudukSubLayerVisible('blankspot', this.checked)"> Blank Spot
|
||||
</label>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="dl-filter-row">
|
||||
<?php if ($is_admin || $is_op): ?>
|
||||
<select id="filterKeterjangkauan" class="dl-select-filter" style="width: 100%;" onchange="window._pendudukSetFilter && window._pendudukSetFilter()">
|
||||
<option value="">Semua Keterjangkauan</option>
|
||||
<option value="terjangkau">Terjangkau</option>
|
||||
<option value="blankspot">Blank Spot</option>
|
||||
</select>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="dl-list" id="dlListPenduduk">
|
||||
<div class="dl-empty">Belum ada data.</div>
|
||||
</div>
|
||||
|
||||
@@ -5,6 +5,12 @@ if (!defined('DB_HOST')) require_once __DIR__ . '/config.php';
|
||||
mysqli_report(MYSQLI_REPORT_OFF);
|
||||
$conn = @new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);
|
||||
|
||||
if ($conn->connect_error && DB_USER !== (getenv('DB_USER') ?: 'root')) {
|
||||
$fallback_user = getenv('DB_USER') ?: 'root';
|
||||
$fallback_pass = getenv('DB_PASS') ?: '';
|
||||
$conn = @new mysqli(DB_HOST, $fallback_user, $fallback_pass, DB_NAME, DB_PORT);
|
||||
}
|
||||
|
||||
if ($conn->connect_error) {
|
||||
error_log('Database connection failed: ' . $conn->connect_error);
|
||||
http_response_code(500);
|
||||
|
||||
@@ -20,7 +20,9 @@ function check($label, $ok) {
|
||||
|
||||
check('cookie httponly enabled', strpos($helper, "'httponly' => true") !== false);
|
||||
check('cookie samesite strict enabled', strpos($helper, "'samesite' => 'Strict'") !== false);
|
||||
check('cookie secure detects HTTPS', strpos($helper, "'secure' => (!empty(\$_SERVER['HTTPS']) && \$_SERVER['HTTPS'] !== 'off')") !== false);
|
||||
$has_secure_detect = (strpos($helper, '\'secure\' => $is_https') !== false && strpos($helper, '$is_https =') !== false)
|
||||
|| strpos($helper, '\'secure\' => (!empty($_SERVER[\'HTTPS\']) && $_SERVER[\'HTTPS\'] !== \'off\')') !== false;
|
||||
check('cookie secure detects HTTPS', $has_secure_detect);
|
||||
|
||||
echo "\n--- {$pass} passed, {$fail} failed ---\n";
|
||||
exit($fail > 0 ? 1 : 0);
|
||||
|
||||
+11
-12
@@ -2,17 +2,17 @@ services:
|
||||
app:
|
||||
build: .
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- "80"
|
||||
ports:
|
||||
- "${APP_PORT:-8080}:80"
|
||||
environment:
|
||||
DB_HOST: db
|
||||
DB_USER: root
|
||||
DB_PASS: ${MARIADB_ROOT_PASSWORD:?Set MARIADB_ROOT_PASSWORD in Coolify}
|
||||
DB_HOST: ${DB_HOST:-db}
|
||||
DB_USER: ${DB_USER:-root}
|
||||
DB_PASS: ${DB_PASS:-${MARIADB_ROOT_PASSWORD:?Set MARIADB_ROOT_PASSWORD in Coolify}}
|
||||
APP_DB_USER: ${APP_DB_USER:-}
|
||||
APP_DB_PASSWORD: ${APP_DB_PASSWORD:-}
|
||||
DB_PORT: 3306
|
||||
DB_01_NAME: db_webgis_01
|
||||
DB_WEBGIS_NAME: db_webgis
|
||||
DB_PORT: ${DB_PORT:-3306}
|
||||
DB_01_NAME: ${DB_01_NAME:-db_webgis_01}
|
||||
DB_WEBGIS_NAME: ${DB_WEBGIS_NAME:-db_webgis}
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
@@ -29,9 +29,8 @@ services:
|
||||
environment:
|
||||
MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD:?Set MARIADB_ROOT_PASSWORD in Coolify}
|
||||
volumes:
|
||||
- db_data:/var/lib/mysql
|
||||
- ./01/setup_database.sql:/docker-entrypoint-initdb.d/01-db-webgis-01.sql:ro
|
||||
- ./WebgisPovertyMapping/setup_database.sql:/docker-entrypoint-initdb.d/02-db-webgis.sql:ro
|
||||
- db_data_v2:/var/lib/mysql
|
||||
- ./docker/init_all_databases.sql:/docker-entrypoint-initdb.d/init_all_databases.sql:ro
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "mariadb-admin ping -h localhost -uroot -p$${MARIADB_ROOT_PASSWORD} --silent"]
|
||||
interval: 10s
|
||||
@@ -40,4 +39,4 @@ services:
|
||||
start_period: 30s
|
||||
|
||||
volumes:
|
||||
db_data:
|
||||
db_data_v2:
|
||||
|
||||
@@ -0,0 +1,223 @@
|
||||
-- =========================================================================
|
||||
-- DATABASE 1: db_webgis_01 (Project 01: WebGIS Choropleth Visualizer)
|
||||
-- =========================================================================
|
||||
CREATE DATABASE IF NOT EXISTS db_webgis_01 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE db_webgis_01;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
username VARCHAR(100) UNIQUE NOT NULL,
|
||||
password VARCHAR(255) NOT NULL
|
||||
);
|
||||
|
||||
INSERT IGNORE INTO users (username, password) VALUES (
|
||||
'admin',
|
||||
'$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi'
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS choropleth_layers (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
nama VARCHAR(150) NOT NULL,
|
||||
deskripsi TEXT,
|
||||
geojson LONGTEXT NOT NULL,
|
||||
attribute_key VARCHAR(100) NOT NULL,
|
||||
palette ENUM('blue','orange','green','purple') DEFAULT 'blue',
|
||||
is_visible TINYINT(1) NOT NULL DEFAULT 1,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS lokasi_usaha (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
nama_tempat VARCHAR(150) NOT NULL,
|
||||
no_wa VARCHAR(30) DEFAULT NULL,
|
||||
buka_24jam TINYINT(1) NOT NULL DEFAULT 0,
|
||||
latitude DECIMAL(10,8) NOT NULL,
|
||||
longitude DECIMAL(11,8) NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS data_jalan (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
nama_jalan VARCHAR(150) NOT NULL,
|
||||
status_jalan ENUM('Nasional','Provinsi','Kabupaten') NOT NULL DEFAULT 'Kabupaten',
|
||||
geojson LONGTEXT NOT NULL,
|
||||
panjang_meter DOUBLE NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS data_parsil (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
nama_parsil VARCHAR(150) NOT NULL,
|
||||
status_kepemilikan ENUM('SHM','HGB','HGU','HP') NOT NULL DEFAULT 'SHM',
|
||||
geojson LONGTEXT NOT NULL,
|
||||
luas_m2 DOUBLE NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- DATABASE 2: db_webgis (Aplikasi Final: WebGIS Poverty Mapping)
|
||||
-- =========================================================================
|
||||
CREATE DATABASE IF NOT EXISTS db_webgis CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE db_webgis;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS rumah_ibadah (
|
||||
id INT NOT NULL AUTO_INCREMENT,
|
||||
nama VARCHAR(150) NOT NULL,
|
||||
jenis ENUM('Masjid','Mushola','Gereja','Pura','Vihara','Klenteng') NOT NULL DEFAULT 'Masjid',
|
||||
alamat TEXT DEFAULT NULL,
|
||||
lat DECIMAL(10,8) NOT NULL,
|
||||
lng DECIMAL(11,8) NOT NULL,
|
||||
radius_m INT NOT NULL DEFAULT 500,
|
||||
kontak VARCHAR(100) DEFAULT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
deleted_at TIMESTAMP NULL DEFAULT NULL,
|
||||
PRIMARY KEY (id),
|
||||
INDEX idx_ri_deleted (deleted_at)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
ALTER TABLE rumah_ibadah
|
||||
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER created_at,
|
||||
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL DEFAULT NULL AFTER updated_at;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS penduduk_miskin (
|
||||
id INT NOT NULL AUTO_INCREMENT,
|
||||
nama_kk VARCHAR(150) NOT NULL,
|
||||
nik VARCHAR(16) DEFAULT NULL,
|
||||
jumlah_jiwa INT NOT NULL DEFAULT 1,
|
||||
kategori ENUM('Sangat Miskin','Miskin','Hampir Miskin') DEFAULT 'Miskin',
|
||||
alamat TEXT DEFAULT NULL,
|
||||
catatan TEXT DEFAULT NULL,
|
||||
lat DECIMAL(10,8) NOT NULL,
|
||||
lng DECIMAL(11,8) NOT NULL,
|
||||
ibadah_id INT DEFAULT NULL,
|
||||
jarak_m FLOAT DEFAULT NULL,
|
||||
is_blank_spot TINYINT(1) DEFAULT 0,
|
||||
status_bantuan ENUM('Belum Ditangani','Dalam Proses','Sudah Ditangani') DEFAULT 'Belum Ditangani',
|
||||
status_verifikasi ENUM('Pending','Terverifikasi','Ditolak') NOT NULL DEFAULT 'Pending',
|
||||
verified_by INT DEFAULT NULL,
|
||||
verified_at TIMESTAMP NULL DEFAULT NULL,
|
||||
catatan_verifikasi TEXT DEFAULT NULL,
|
||||
is_active TINYINT(1) DEFAULT 1,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
deleted_at TIMESTAMP NULL DEFAULT NULL,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uq_nik (nik),
|
||||
INDEX idx_pm_blank (is_blank_spot),
|
||||
INDEX idx_pm_active (is_active),
|
||||
INDEX idx_pm_verifikasi (status_verifikasi),
|
||||
INDEX idx_pm_deleted(deleted_at),
|
||||
FOREIGN KEY (ibadah_id) REFERENCES rumah_ibadah(id) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
ALTER TABLE penduduk_miskin
|
||||
ADD COLUMN IF NOT EXISTS catatan TEXT DEFAULT NULL AFTER alamat,
|
||||
ADD COLUMN IF NOT EXISTS is_blank_spot TINYINT(1) DEFAULT 0 AFTER jarak_m,
|
||||
ADD COLUMN IF NOT EXISTS status_bantuan ENUM('Belum Ditangani','Dalam Proses','Sudah Ditangani') DEFAULT 'Belum Ditangani' AFTER is_blank_spot,
|
||||
ADD COLUMN IF NOT EXISTS status_verifikasi ENUM('Pending','Terverifikasi','Ditolak') NOT NULL DEFAULT 'Pending' AFTER status_bantuan,
|
||||
ADD COLUMN IF NOT EXISTS verified_by INT DEFAULT NULL AFTER status_verifikasi,
|
||||
ADD COLUMN IF NOT EXISTS verified_at TIMESTAMP NULL DEFAULT NULL AFTER verified_by,
|
||||
ADD COLUMN IF NOT EXISTS catatan_verifikasi TEXT DEFAULT NULL AFTER verified_at,
|
||||
ADD COLUMN IF NOT EXISTS is_active TINYINT(1) DEFAULT 1 AFTER catatan_verifikasi,
|
||||
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER created_at,
|
||||
ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP NULL DEFAULT NULL AFTER updated_at;
|
||||
|
||||
ALTER TABLE penduduk_miskin ADD INDEX IF NOT EXISTS idx_pm_verifikasi (status_verifikasi);
|
||||
ALTER TABLE penduduk_miskin ADD UNIQUE INDEX IF NOT EXISTS uq_nik (nik);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INT NOT NULL AUTO_INCREMENT,
|
||||
username VARCHAR(100) NOT NULL,
|
||||
nama_lengkap VARCHAR(150) NOT NULL,
|
||||
password VARCHAR(255) NOT NULL,
|
||||
role ENUM('administrator','operator','viewer') NOT NULL DEFAULT 'viewer',
|
||||
ibadah_id INT NULL DEFAULT NULL,
|
||||
is_active TINYINT(1) NOT NULL DEFAULT 1,
|
||||
must_change_password TINYINT(1) NOT NULL DEFAULT 0,
|
||||
login_attempts INT NOT NULL DEFAULT 0,
|
||||
locked_until TIMESTAMP NULL DEFAULT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uq_username (username),
|
||||
FOREIGN KEY (ibadah_id) REFERENCES rumah_ibadah(id) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS riwayat_bantuan (
|
||||
id INT NOT NULL AUTO_INCREMENT,
|
||||
penduduk_id INT NOT NULL,
|
||||
operator_id INT NOT NULL,
|
||||
status_lama VARCHAR(50) DEFAULT NULL,
|
||||
status_baru VARCHAR(50) NOT NULL,
|
||||
catatan TEXT DEFAULT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (id),
|
||||
FOREIGN KEY (penduduk_id) REFERENCES penduduk_miskin(id),
|
||||
FOREIGN KEY (operator_id) REFERENCES users(id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS kebutuhan (
|
||||
id INT NOT NULL AUTO_INCREMENT,
|
||||
penduduk_id INT NOT NULL,
|
||||
kategori ENUM('Sembako','Biaya Sekolah','Biaya Kesehatan','Modal Usaha',
|
||||
'Renovasi Rumah','Perlengkapan Rumah','Pakaian','Lainnya') NOT NULL,
|
||||
deskripsi VARCHAR(300) DEFAULT NULL,
|
||||
status ENUM('Belum Terpenuhi','Dalam Proses','Terpenuhi') NOT NULL DEFAULT 'Belum Terpenuhi',
|
||||
created_by INT NOT NULL,
|
||||
updated_by INT DEFAULT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (id),
|
||||
INDEX idx_k_penduduk (penduduk_id),
|
||||
INDEX idx_k_status (status),
|
||||
INDEX idx_k_kategori (kategori),
|
||||
FOREIGN KEY (penduduk_id) REFERENCES penduduk_miskin(id),
|
||||
FOREIGN KEY (created_by) REFERENCES users(id),
|
||||
FOREIGN KEY (updated_by) REFERENCES users(id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS riwayat_kebutuhan (
|
||||
id INT NOT NULL AUTO_INCREMENT,
|
||||
kebutuhan_id INT NOT NULL,
|
||||
operator_id INT NOT NULL,
|
||||
status_lama VARCHAR(50) DEFAULT NULL,
|
||||
status_baru VARCHAR(50) NOT NULL,
|
||||
catatan TEXT DEFAULT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (id),
|
||||
FOREIGN KEY (kebutuhan_id) REFERENCES kebutuhan(id),
|
||||
FOREIGN KEY (operator_id) REFERENCES users(id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS kontak_donatur (
|
||||
id INT NOT NULL AUTO_INCREMENT,
|
||||
nama VARCHAR(150) NOT NULL,
|
||||
kontak VARCHAR(150) NOT NULL,
|
||||
kategori_minat ENUM('Sembako','Biaya Sekolah','Biaya Kesehatan','Modal Usaha',
|
||||
'Renovasi Rumah','Perlengkapan Rumah','Pakaian','Lainnya') DEFAULT NULL,
|
||||
pesan TEXT DEFAULT NULL,
|
||||
is_read TINYINT(1) NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (id),
|
||||
INDEX idx_kd_read (is_read)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
INSERT INTO rumah_ibadah (nama, jenis, alamat, lat, lng, radius_m, kontak)
|
||||
SELECT 'Masjid Demo Operator', 'Masjid', 'Pontianak, Kalimantan Barat', -0.05570000, 109.34870000, 1000, '081234567890'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM rumah_ibadah WHERE deleted_at IS NULL);
|
||||
|
||||
INSERT INTO users (username, nama_lengkap, password, role, ibadah_id, is_active, must_change_password)
|
||||
VALUES
|
||||
('admin', 'Administrator', '$2y$10$SBXp6R9CuUxfD3gai9cVN.iPrHzFLqVi33bqbCAnuWBj7v0uTuYMK', 'administrator', NULL, 1, 0),
|
||||
('operator', 'Operator Demo', '$2y$10$SBXp6R9CuUxfD3gai9cVN.iPrHzFLqVi33bqbCAnuWBj7v0uTuYMK', 'operator', (SELECT id FROM rumah_ibadah WHERE deleted_at IS NULL ORDER BY id LIMIT 1), 1, 0),
|
||||
('viewer', 'Viewer Demo', '$2y$10$SBXp6R9CuUxfD3gai9cVN.iPrHzFLqVi33bqbCAnuWBj7v0uTuYMK', 'viewer', NULL, 1, 0)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
nama_lengkap = VALUES(nama_lengkap),
|
||||
password = VALUES(password),
|
||||
role = VALUES(role),
|
||||
ibadah_id = VALUES(ibadah_id),
|
||||
is_active = 1,
|
||||
must_change_password = 0,
|
||||
login_attempts = 0,
|
||||
locked_until = NULL;
|
||||
@@ -17,6 +17,12 @@ function check_database(string $label, string $database, ?string $user = null, ?
|
||||
|
||||
$connection = @new mysqli($host, $username, $dbPassword, $database, $port);
|
||||
|
||||
if ($connection->connect_error && $username !== env_value('DB_USER', 'root')) {
|
||||
$username = env_value('DB_USER', 'root');
|
||||
$dbPassword = env_value('DB_PASS', '');
|
||||
$connection = @new mysqli($host, $username, $dbPassword, $database, $port);
|
||||
}
|
||||
|
||||
if ($connection->connect_error) {
|
||||
error_log("Health check database failed ({$label}): " . $connection->connect_error);
|
||||
return [
|
||||
|
||||
Reference in New Issue
Block a user