const fs = require('fs'); const csv = require('csv-parser'); const db = require('../config/database'); // Memproses unggahan berkas CSV dan memasukkan datanya ke tabel MUSTAHIK const import_data_bps = (req, res) => { try { // Praktik keamanan: Memastikan ada berkas yang dikirimkan oleh klien sebelum sistem mencoba membacanya if (!req.file) { return res.status(400).json({ error: 'Tidak ada berkas CSV yang diunggah' }); } const path_berkas = req.file.path; const hasil_parsing = []; // Baris kompleks: Kita menggunakan fs.createReadStream untuk membaca berkas secara bertahap (streaming) agar memori peladen tidak kelebihan beban jika ukuran CSV sangat besar, lalu mengalirkannya (pipe) ke modul csv-parser untuk diubah menjadi baris objek JavaScript secara asinkron. fs.createReadStream(path_berkas) .pipe(csv()) .on('data', (data) => hasil_parsing.push(data)) .on('end', () => { db.serialize(() => { db.run('BEGIN TRANSACTION'); // Data dari BPS langsung ditandai 'Verified' karena sudah merupakan data resmi const perintah_insert = db.prepare(`INSERT INTO MUSTAHIK (nik, nama_kk, lat, lng, status_validasi) VALUES (?, ?, ?, ?, 'Verified')`); hasil_parsing.forEach((baris) => { // Menyesuaikan dengan standar header kolom CSV: NIK, Nama_KK, Latitude, Longitude perintah_insert.run([baris.NIK, baris.Nama_KK, baris.Latitude, baris.Longitude], (err) => { if (err) { console.error('Gagal mengimpor baris data:', err.message); } }); }); perintah_insert.finalize(); db.run('COMMIT', (err) => { if (err) { db.run('ROLLBACK'); return res.status(500).json({ error: 'Gagal menyimpan data impor ke basis data' }); } // Praktik keamanan dan kebersihan: Menghapus berkas CSV sementara dari peladen secara otomatis setelah seluruh datanya berhasil diekstrak ke dalam tabel fs.unlinkSync(path_berkas); res.status(200).json({ message: `Berhasil mengimpor ${hasil_parsing.length} data baseline BPS` }); }); }); }) .on('error', (error) => { // Penanganan kesalahan otomatis saat file CSV korup fs.unlinkSync(path_berkas); res.status(500).json({ error: 'Kesalahan saat membaca struktur baris CSV' }); }); } catch (error) { console.error('Kesalahan sistem impor:', error); res.status(500).json({ error: 'Kegagalan pemrosesan internal server' }); } }; module.exports = { import_data_bps };