Files
UAS-SIG/controllers/import_controller.js
2026-06-03 20:05:50 +07:00

65 lines
3.0 KiB
JavaScript

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
};