diff --git a/seeders/seed_manager.js b/seeders/seed_manager.js new file mode 100644 index 0000000..cc6dd32 --- /dev/null +++ b/seeders/seed_manager.js @@ -0,0 +1,73 @@ +const sqlite3 = require('sqlite3').verbose(); +const path = require('path'); + +// Mengimpor fungsi seeder asli bawaan milik Anda +const seed_admin = require('./seed_admin'); +const seed_petugas = require('./seed_petugas'); +const rumah_ibadah_seeder = require('./rumah_ibadah_seeder'); + +// Jalur absolut database yang terhubung langsung ke Persistent Storage Coolify +const db_path = '/app/data/database_baru.sqlite'; + +/** + * Mengatur jalannya proses inisialisasi tabel dan penanaman kredensial master + */ +async function inisialisasi_dan_seeding() { + const db = new sqlite3.Database(db_path); + + return new Promise((resolve, reject) => { + db.serialize(async () => { + try { + // 1. Memastikan tabel master yang dibutuhkan sistem Express terbentuk sempurna + db.run(`CREATE TABLE IF NOT EXISTS ADMIN ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + username TEXT UNIQUE, + password TEXT + )`); + + db.run(`CREATE TABLE IF NOT EXISTS PETUGAS ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + username TEXT UNIQUE, + password TEXT + )`); + + db.run(`CREATE TABLE IF NOT EXISTS MUSTAHIK ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + nik TEXT UNIQUE, + nama_kk TEXT, + no_kk TEXT, + jumlah_tanggungan INTEGER, + status_validasi TEXT DEFAULT 'Pending', + lat REAL, + lng REAL, + luas_lantai_per_kapita TEXT, + material_lantai TEXT, + material_dinding TEXT, + fasilitas_sanitasi TEXT, + sumber_air_minum TEXT, + sumber_penerangan TEXT, + pekerjaan_utama TEXT, + pendapatan_bulanan REAL, + frekuensi_makan TEXT, + kepemilikan_aset TEXT + )`); + + // 2. Mengeksekusi modul fungsi seeder bawaan milik Anda secara berurutan + console.log('Memulai penanaman data kredensial...'); + + // Catatan: Pastikan file seeder Anda mengekspor fungsi (contoh: module.exports = function...) + if (typeof seed_admin === 'function') await seed_admin(db); + if (typeof seed_petugas === 'function') await seed_petugas(db); + if (typeof rumah_ibadah_seeder === 'function') await rumah_ibadah_seeder(db); + + resolve(); + } catch (err) { + reject(err); + } finally { + db.close(); + } + }); + }); +} + +module.exports = { inisialisasi_dan_seeding }; \ No newline at end of file diff --git a/server.js b/server.js index c31a92d..ade2d5d 100644 --- a/server.js +++ b/server.js @@ -56,6 +56,15 @@ app.use((err, req, res, next) => { }); // Menjalankan server -app.listen(port, () => { +app.listen(port, async () => { console.log(`Server WebGIS berjalan dan siap diakses pada port ${port}`); + + // Praktik Penanganan Kesalahan Otomatis: + // Menjalankan proses pembuatan tabel dan penanaman data master jika SQLite kosong + try { + await inisialisasi_dan_seeding(); + console.log('Sinkronisasi data seeder bawaan ke database produksi sukses.'); + } catch (error_sistem_seed) { + console.error('Peringatan: Gagal mengeksekusi database seeder:', error_sistem_seed.message); + } }); \ No newline at end of file