feat : first commit
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
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
|
||||
};
|
||||
Reference in New Issue
Block a user