65 lines
3.0 KiB
JavaScript
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
|
|
}; |