Add more tables to db and processing to import script, add error logging to import, add test data snapshots (untested)

This commit is contained in:
2025-01-11 13:07:07 -05:00
parent 1d022cae01
commit 30018ad882
5 changed files with 1029 additions and 117 deletions

View File

@@ -0,0 +1,115 @@
const fs = require('fs');
const path = require('path');
const mysql = require('mysql2/promise');
const dotenv = require('dotenv');
dotenv.config({ path: path.join(__dirname, '../.env') });
const dbConfig = {
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
multipleStatements: true
};
const SNAPSHOTS_DIR = path.join(__dirname, '../snapshots');
async function createSnapshot() {
console.log('Creating test database snapshot...');
const pool = mysql.createPool(dbConfig);
try {
const connection = await pool.getConnection();
try {
// Create snapshots directory if it doesn't exist
if (!fs.existsSync(SNAPSHOTS_DIR)) {
fs.mkdirSync(SNAPSHOTS_DIR, { recursive: true });
}
// Get categories
const [categories] = await connection.query(`
SELECT id, name, created_at
FROM categories
LIMIT 10
`);
// Get a diverse set of ~100 products
const [products] = await connection.query(`
SELECT p.*
FROM products p
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.product_id = p.product_id
UNION
SELECT 1 FROM purchase_orders po WHERE po.product_id = p.product_id
)
ORDER BY RAND()
LIMIT 100
`);
// Get product_categories for selected products
const [product_categories] = await connection.query(`
SELECT pc.product_id, pc.category_id
FROM product_categories pc
WHERE pc.product_id IN (?)
`, [products.map(p => p.product_id)]);
// Get orders for selected products (last 6 months)
const [orders] = await connection.query(`
SELECT o.*
FROM orders o
WHERE o.product_id IN (?)
AND o.date >= DATE_SUB(NOW(), INTERVAL 6 MONTH)
ORDER BY o.date DESC
`, [products.map(p => p.product_id)]);
// Get purchase orders for selected products (last 6 months)
const [purchase_orders] = await connection.query(`
SELECT po.*
FROM purchase_orders po
WHERE po.product_id IN (?)
AND po.date >= DATE_SUB(NOW(), INTERVAL 6 MONTH)
ORDER BY po.date DESC
`, [products.map(p => p.product_id)]);
// Create snapshot object
const snapshot = {
metadata: {
created_at: new Date().toISOString(),
description: 'Test snapshot with ~100 diverse products and their related data'
},
categories,
products,
product_categories,
orders,
purchase_orders
};
// Save snapshot
const snapshotPath = path.join(SNAPSHOTS_DIR, 'test_snapshot.json');
fs.writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2));
console.log('Snapshot created successfully:');
console.log('Products:', products.length);
console.log('Orders:', orders.length);
console.log('Purchase Orders:', purchase_orders.length);
console.log('Categories:', categories.length);
console.log('Saved to:', snapshotPath);
} finally {
connection.release();
}
} catch (error) {
console.error('Error creating snapshot:', error);
throw error;
} finally {
await pool.end();
}
}
// Create snapshot if run directly
if (require.main === module) {
createSnapshot().catch(console.error);
}
module.exports = { createSnapshot };