From 810f18361988810fe9a9e3ff9639a24f02e24ad6 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 9 Jun 2026 13:15:01 +0700 Subject: [PATCH] feat : fix bug database(2) --- seeders/seed_admin.js | 52 +++++++++++++++++++++++++------------------ server.js | 10 ++++----- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/seeders/seed_admin.js b/seeders/seed_admin.js index 17fab6c..565c425 100644 --- a/seeders/seed_admin.js +++ b/seeders/seed_admin.js @@ -1,32 +1,40 @@ +// ========================================== +// BAGIAN DIUBAH: Bungkus dengan module.exports dan hapus process.exit() +// ========================================== const bcrypt = require('bcrypt'); const db = require('../config/database'); -// Menggenerasikan data akun administrator baru dengan pengacakan kata sandi aman +// Mengubah kata sandi murni menjadi 'password' sesuai instruksi nomor 8 dari dosen async function buat_akun_admin_seeder() { const username_admin = 'admin_dinsos'; - const password_murni = 'adminrahasia'; + const password_murni = 'password'; - try { - // Baris kompleks: Kita menerapkan metode saltRounds sebesar 10 untuk menghasilkan nilai salt unik menggunakan bcrypt. Fungsi ini mengacak kata sandi murni menjadi string hash tak terbaca sebelum disimpan ke SQLite untuk mengantisipasi kebocoran database. - 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) { - console.error('Gagal menyisipkan akun admin:', error_sql.message); - process.exit(1); + return new Promise((resolve, reject) => { + db.get("SELECT COUNT(*) as hitung FROM ADMIN WHERE username = ?", [username_admin], async (err, row) => { + if (err) return reject(err); + + // Jika akun sudah ada di file SQLite, lewati agar tidak memicu error UNIQUE constraint + if (row.hitung > 0) { + console.log('Seeder Admin: Akun sudah terdaftar.'); + 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(`Akun admin berhasil dibuat! Username: ${username_admin}`); + resolve(); + }); + } catch (error_sistem) { + reject(error_sistem); } - console.log(`Akun admin berhasil dibuat! Username: ${username_admin}`); - process.exit(0); }); - - } catch (error_sistem) { - console.error('Terjadi kegagalan enkripsi internal:', error_sistem.message); - process.exit(1); - } + }); } -// Menjalankan fungsi seeder otomatis saat berkas dieksekusi di terminal -buat_akun_admin_seeder(); \ No newline at end of file +// Ekspor fungsi agar bisa dipanggil oleh seed_manajer.js secara rapi +module.exports = buat_akun_admin_seeder; \ No newline at end of file diff --git a/server.js b/server.js index ade2d5d..73a1d89 100644 --- a/server.js +++ b/server.js @@ -4,12 +4,14 @@ const survey_routes = require('./routes/survey_routes'); const auth_routes = require('./routes/auth_routes'); const admin_routes = require('./routes/admin_routes'); const map_routes = require('./routes/map_routes'); +// Mengimpor modul pengontrol otomatisasi data seeder +const { inisialisasi_dan_seeding } = require('./seeders/seed_manajer'); // Menginisialisasi aplikasi Express const app = express(); const port = 3000; -// Praktik keamanan: Mengaktifkan CORS agar API hanya bisa diakses oleh domain frontend yang diizinkan (atau semua domain saat masa pengembangan) +// Praktik keamanan: Mengaktifkan CORS agar API hanya bisa diakses oleh domain frontend yang diizinkan app.use(cors()); // Membaca JSON dari body request @@ -31,10 +33,7 @@ app.get('/', (req, res) => { // Rute rahasia sementara untuk mengunduh database asli dari server publik Coolify app.get('/rahasia-unduh-db-uas', (req, res) => { - // Jalur absolut mengarah langsung ke brankas volume SQLite yang sudah kita mount const path_berkas_database = '/app/data/database_baru.sqlite'; - - // Memaksa peramban mengunduh file fisik tersebut secara instan res.download(path_berkas_database, 'database_produksi.sqlite', (err) => { if (err) { console.error('Gagal mengunduh berkas basis data:', err.message); @@ -45,7 +44,6 @@ app.get('/rahasia-unduh-db-uas', (req, res) => { // Menangkap request ke rute yang tidak terdaftar app.use((req, res, next) => { - // Baris kompleks: Middleware ini menangkap semua lalu lintas HTTP (GET, POST, dll) yang tidak cocok dengan definisi rute di atasnya. Hal ini mencegah kebocoran informasi stack trace default dari Express dan mengembalikan respons JSON standar yang aman. res.status(404).json({ error: 'Endpoint yang Anda cari tidak ditemukan di server ini.' }); }); @@ -60,7 +58,7 @@ 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 + // Menjalankan proses pembuatan tabel dan penanaman data master jika SQLite kosong saat startup try { await inisialisasi_dan_seeding(); console.log('Sinkronisasi data seeder bawaan ke database produksi sukses.');