generated from MuhammadIqbalMaulana/UAS-SIG
Initial commit
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* Menyuntikkan data lokasi tempat penyaluran bantuan (Rumah Ibadah) di Pontianak
|
||||
* @param {object} db - Instansi koneksi SQLite
|
||||
*/
|
||||
async function buat_seeder_rumah_ibadah(db) {
|
||||
// Array objek berisi titik koordinat asli tempat ibadah ikonik di Pontianak
|
||||
const daftar_rumah_ibadah = [
|
||||
{ nama: 'Masjid Raya Mujahidin', agama: 'Islam', lat: -0.0336, lng: 109.3364, alamat: 'Jl. Ahmad Yani' },
|
||||
{ nama: 'Gereja Katedral Santo Yosef', agama: 'Katolik', lat: -0.0331, lng: 109.3330, alamat: 'Jl. Pattimura' },
|
||||
{ nama: 'Gereja HKBP Pontianak', agama: 'Kristen Protestan', lat: -0.0305, lng: 109.3321, alamat: 'Jl. Pulau We' },
|
||||
{ nama: 'Vihara Bodhisatva Karaniya Metta', agama: 'Buddha', lat: -0.0255, lng: 109.3361, alamat: 'Jl. Kapten Marsan' },
|
||||
{ nama: 'Pura Giripati Mulawarman', agama: 'Hindu', lat: -0.0631, lng: 109.3705, alamat: 'Jl. Adi Sucipto' },
|
||||
{ nama: 'Kelenteng Kwan Tie Bio', agama: 'Konghucu', lat: -0.0261, lng: 109.3352, alamat: 'Jl. Diponegoro' }
|
||||
];
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
db.get("SELECT COUNT(*) as hitung FROM RUMAH_IBADAH", [], (err, row) => {
|
||||
if (err) return reject(err);
|
||||
|
||||
if (row.hitung > 0) {
|
||||
console.log('Seeder Rumah Ibadah: Data titik penyaluran sudah tersedia.');
|
||||
return resolve();
|
||||
}
|
||||
|
||||
try {
|
||||
const kueri_insert = `INSERT INTO RUMAH_IBADAH (nama_tempat, agama, lat, lng, alamat) VALUES (?, ?, ?, ?, ?)`;
|
||||
|
||||
daftar_rumah_ibadah.forEach((tempat) => {
|
||||
db.run(kueri_insert, [tempat.nama, tempat.agama, tempat.lat, tempat.lng, tempat.alamat], (error_sql) => {
|
||||
if (error_sql) console.error(`Gagal menyisipkan ${tempat.nama}:`, error_sql.message);
|
||||
});
|
||||
});
|
||||
|
||||
console.log('Seeder: 6 Titik pangkalan rumah ibadah Pontianak berhasil diinisialisasi.');
|
||||
resolve();
|
||||
} catch (error_sistem) {
|
||||
reject(error_sistem);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = buat_seeder_rumah_ibadah;
|
||||
@@ -0,0 +1,38 @@
|
||||
const bcrypt = require('bcrypt');
|
||||
|
||||
/**
|
||||
* Menyuntikkan akun administrator secara aman dengan pencegahan duplikasi data
|
||||
* @param {object} db - Instansi koneksi SQLite
|
||||
*/
|
||||
async function buat_akun_admin_seeder(db) {
|
||||
const username_admin = 'admin_dinsos';
|
||||
const password_murni = 'password';
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
// Praktik Keamanan: Memeriksa eksistensi username sebelum melakukan eksekusi penulisan biner
|
||||
db.get("SELECT COUNT(*) as hitung FROM ADMIN WHERE username = ?", [username_admin], async (err, row) => {
|
||||
if (err) return reject(err);
|
||||
|
||||
if (row.hitung > 0) {
|
||||
console.log(`Seeder Admin: Akun '${username_admin}' sudah aman tersedia.`);
|
||||
return resolve();
|
||||
}
|
||||
|
||||
try {
|
||||
const salt_rounds = 10;
|
||||
const password_terhash = await bcrypt.hash(password_murni, salt_rounds);
|
||||
const kueri_insert = `INSERT INTO ADMIN (username, password) VALUES (?, ?)`;
|
||||
|
||||
db.run(kueri_insert, [username_admin, password_terhash], function(error_sql) {
|
||||
if (error_sql) return reject(error_sql);
|
||||
console.log(`Seeder: Akun admin '${username_admin}' berhasil diinisialisasi.`);
|
||||
resolve();
|
||||
});
|
||||
} catch (error_sistem) {
|
||||
reject(error_sistem);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = buat_akun_admin_seeder;
|
||||
@@ -0,0 +1,87 @@
|
||||
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, migrasi kolom, dan penanaman data 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 dasar terbuat dengan 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
|
||||
)`);
|
||||
|
||||
db.run(`CREATE TABLE IF NOT EXISTS RUMAH_IBADAH (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
nama_tempat TEXT,
|
||||
agama TEXT,
|
||||
lat REAL,
|
||||
lng REAL,
|
||||
alamat TEXT
|
||||
)`);
|
||||
|
||||
// 2. Baris Kompleks: Melakukan pemeriksaan skema internal tabel MUSTAHIK secara asinkron menggunakan perintah PRAGMA. Hasil pemindaian berupa array objek kolom diverifikasi terlebih dahulu guna menghindari eksekusi ganda perintah ALTER TABLE yang berpotensi merusak konsistensi biner SQLite.
|
||||
db.all(`PRAGMA table_info(MUSTAHIK)`, [], async (err_pragma, kolom_kolom) => {
|
||||
if (err_pragma) {
|
||||
console.error("Gagal membaca struktur tabel via PRAGMA:", err_pragma.message);
|
||||
return;
|
||||
}
|
||||
|
||||
const sudah_ada_agama = kolom_kolom.some(k => k.name === 'agama');
|
||||
const sudah_ada_pangkalan = kolom_kolom.some(k => k.name === 'id_rumah_ibadah');
|
||||
|
||||
if (!sudah_ada_agama) {
|
||||
db.run("ALTER TABLE MUSTAHIK ADD COLUMN agama TEXT");
|
||||
}
|
||||
if (!sudah_ada_pangkalan) {
|
||||
db.run("ALTER TABLE MUSTAHIK ADD COLUMN id_rumah_ibadah INTEGER");
|
||||
}
|
||||
|
||||
// 3. Mengeksekusi seluruh fungsi seeder secara berurutan setelah penjaminan kolom selesai
|
||||
console.log('Memulai sinkronisasi penanaman data master...');
|
||||
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);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = { inisialisasi_dan_seeding };
|
||||
@@ -0,0 +1,38 @@
|
||||
const bcrypt = require('bcrypt');
|
||||
|
||||
/**
|
||||
* Menyuntikkan akun petugas lapangan secara aman dengan pencegahan duplikasi data
|
||||
* @param {object} db - Instansi koneksi SQLite
|
||||
*/
|
||||
async function buat_akun_petugas_seeder(db) {
|
||||
const username_petugas = 'petugas_lapangan';
|
||||
const password_murni = 'password';
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
// Praktik Keamanan: Memeriksa eksistensi username guna menghindari kegagalan SQLITE_CONSTRAINT
|
||||
db.get("SELECT COUNT(*) as hitung FROM PETUGAS WHERE username = ?", [username_petugas], async (err, row) => {
|
||||
if (err) return reject(err);
|
||||
|
||||
if (row.hitung > 0) {
|
||||
console.log(`Seeder Petugas: Akun '${username_petugas}' sudah aman tersedia.`);
|
||||
return resolve();
|
||||
}
|
||||
|
||||
try {
|
||||
const salt_rounds = 10;
|
||||
const password_terhash = await bcrypt.hash(password_murni, salt_rounds);
|
||||
const kueri_insert = `INSERT INTO PETUGAS (username, password) VALUES (?, ?)`;
|
||||
|
||||
db.run(kueri_insert, [username_petugas, password_terhash], function(error_sql) {
|
||||
if (error_sql) return reject(error_sql);
|
||||
console.log(`Seeder: Akun petugas '${username_petugas}' berhasil diinisialisasi.`);
|
||||
resolve();
|
||||
});
|
||||
} catch (error_sistem) {
|
||||
reject(error_sistem);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = buat_akun_petugas_seeder;
|
||||
Reference in New Issue
Block a user