63 lines
1.8 KiB
JavaScript
Executable File
63 lines
1.8 KiB
JavaScript
Executable File
const fs = require('fs');
|
|
const { parse } = require('csv-parse');
|
|
const { v4: uuidv4 } = require('uuid');
|
|
|
|
async function importProductsFromCSV(filePath, pool) {
|
|
return new Promise((resolve, reject) => {
|
|
const products = [];
|
|
|
|
fs.createReadStream(filePath)
|
|
.pipe(parse({
|
|
columns: true,
|
|
skip_empty_lines: true
|
|
}))
|
|
.on('data', async (row) => {
|
|
products.push({
|
|
id: uuidv4(),
|
|
sku: row.sku,
|
|
name: row.name,
|
|
description: row.description || null,
|
|
category: row.category || null
|
|
});
|
|
})
|
|
.on('end', async () => {
|
|
try {
|
|
const connection = await pool.getConnection();
|
|
|
|
try {
|
|
await connection.beginTransaction();
|
|
|
|
for (const product of products) {
|
|
await connection.query(
|
|
'INSERT INTO products (id, sku, name, description, category) VALUES (?, ?, ?, ?, ?)',
|
|
[product.id, product.sku, product.name, product.description, product.category]
|
|
);
|
|
|
|
// Initialize inventory level for the product
|
|
await connection.query(
|
|
'INSERT INTO inventory_levels (id, product_id, quantity) VALUES (?, ?, 0)',
|
|
[uuidv4(), product.id]
|
|
);
|
|
}
|
|
|
|
await connection.commit();
|
|
resolve({ imported: products.length });
|
|
} catch (error) {
|
|
await connection.rollback();
|
|
reject(error);
|
|
} finally {
|
|
connection.release();
|
|
}
|
|
} catch (error) {
|
|
reject(error);
|
|
}
|
|
})
|
|
.on('error', (error) => {
|
|
reject(error);
|
|
});
|
|
});
|
|
}
|
|
|
|
module.exports = {
|
|
importProductsFromCSV
|
|
};
|