78 lines
2.5 KiB
JavaScript
78 lines
2.5 KiB
JavaScript
/**
|
|
* One-off backfill: populate products.notions_cost_each and supplier_cost_each
|
|
* from MySQL supplier_item_data. Idempotent — safe to re-run.
|
|
*
|
|
* Usage (on the server, where the SSH tunnel and env are configured):
|
|
* cd /var/www/inventory && node scripts/backfill-supplier-costs.js
|
|
*
|
|
* After this lands, the daily products import (via syncSupplierCosts in
|
|
* scripts/import/products.js) keeps the columns up to date.
|
|
*/
|
|
|
|
const dotenv = require("dotenv");
|
|
const path = require("path");
|
|
dotenv.config({ path: path.join(__dirname, "../.env") });
|
|
|
|
const { setupConnections, closeConnections } = require("./import/utils");
|
|
const { syncSupplierCosts } = require("./import/products");
|
|
|
|
const sshConfig = {
|
|
ssh: {
|
|
host: process.env.PROD_SSH_HOST,
|
|
port: process.env.PROD_SSH_PORT || 22,
|
|
username: process.env.PROD_SSH_USER,
|
|
privateKey: process.env.PROD_SSH_KEY_PATH
|
|
? require("fs").readFileSync(process.env.PROD_SSH_KEY_PATH)
|
|
: undefined,
|
|
compress: true,
|
|
},
|
|
prodDbConfig: {
|
|
host: process.env.PROD_DB_HOST || "localhost",
|
|
user: process.env.PROD_DB_USER,
|
|
password: process.env.PROD_DB_PASSWORD,
|
|
database: process.env.PROD_DB_NAME,
|
|
port: process.env.PROD_DB_PORT || 3306,
|
|
timezone: "-05:00",
|
|
},
|
|
localDbConfig: {
|
|
host: process.env.DB_HOST,
|
|
user: process.env.DB_USER,
|
|
password: process.env.DB_PASSWORD,
|
|
database: process.env.DB_NAME,
|
|
port: process.env.DB_PORT || 5432,
|
|
ssl: process.env.DB_SSL === "true",
|
|
connectionTimeoutMillis: 60000,
|
|
idleTimeoutMillis: 30000,
|
|
max: 4,
|
|
},
|
|
};
|
|
|
|
(async () => {
|
|
let connections;
|
|
const start = Date.now();
|
|
try {
|
|
console.log("Setting up connections...");
|
|
connections = await setupConnections(sshConfig);
|
|
const { prodConnection, localConnection } = connections;
|
|
|
|
console.log("Starting transaction...");
|
|
await localConnection.beginTransaction();
|
|
|
|
const result = await syncSupplierCosts(prodConnection, localConnection);
|
|
|
|
await localConnection.commit();
|
|
console.log(`Done. Updated ${result.updated} rows in ${(Date.now() - start) / 1000}s`);
|
|
} catch (err) {
|
|
console.error("Backfill failed:", err);
|
|
if (connections?.localConnection?._transactionActive) {
|
|
try { await connections.localConnection.rollback(); } catch (e) {}
|
|
}
|
|
process.exitCode = 1;
|
|
} finally {
|
|
if (connections) {
|
|
try { await closeConnections(connections); } catch (e) { console.error("Close error:", e); }
|
|
}
|
|
process.exit();
|
|
}
|
|
})();
|