From 178fcf4ce2678f4d6f5100a4ee86a990b9468fb5 Mon Sep 17 00:00:00 2001 From: sairajzero Date: Sat, 12 Nov 2022 04:29:28 +0530 Subject: [PATCH] Update database module - Updated database module so that other modules can use it directly by require() - use path module where-ever needed - Fixed: public directory not viewed in browser when opening the link --- setup/configure-settings.js | 3 +- setup/create-schema.js | 7 +- setup/reset-password.js | 5 +- src/app.js | 7 +- src/background.js | 7 +- src/backup/head.js | 8 +- src/backup/slave.js | 8 +- src/backup/sync.js | 9 +- src/blockchain.js | 7 +- src/coupling.js | 9 +- src/database.js | 169 +++++++++++++++++++----------------- src/main.js | 17 ++-- src/market.js | 8 +- src/price.js | 8 +- src/request.js | 10 +-- src/services/bobs-fund.js | 6 +- src/services/bonds.js | 6 +- src/services/conversion.js | 6 +- start.js | 4 +- 19 files changed, 128 insertions(+), 176 deletions(-) diff --git a/setup/configure-settings.js b/setup/configure-settings.js index 9a3b431..e74baaf 100644 --- a/setup/configure-settings.js +++ b/setup/configure-settings.js @@ -1,4 +1,5 @@ const fs = require('fs'); +const path = require('path'); const getInput = require('./getInput'); let _I = ""; @@ -91,7 +92,7 @@ function configure() { configurePort().then(port_result => { randomizeSessionSecret().then(secret_result => { configureSQL().then(sql_result => { - fs.writeFile(__dirname + `/../args/config${_I}.json`, JSON.stringify(config), 'utf8', (err) => { + fs.writeFile(path.resolve(__dirname, '..', 'args', `config${_I}.json`), JSON.stringify(config), 'utf8', (err) => { if (err) { console.error(err); return reject(false); diff --git a/setup/create-schema.js b/setup/create-schema.js index 0b0f6fc..1de1212 100644 --- a/setup/create-schema.js +++ b/setup/create-schema.js @@ -1,5 +1,6 @@ const fs = require('fs'); -let Database = require('../src/database'); +const path = require('path'); +let DB = require('../src/database'); let _I = ""; for (let arg of process.argv) @@ -11,12 +12,12 @@ for (let arg of process.argv) function createSchema() { const config = require(`../args/config${_I}.json`); return new Promise((resolve, reject) => { - fs.readFile(__dirname + '/../args/schema.sql', 'utf8', (err, data) => { + fs.readFile(path.resolve(__dirname, '..', 'args', `schema.sql`), 'utf8', (err, data) => { if (err) { console.error(err); return reject(null); } - Database(config["sql_user"], config["sql_pwd"], config["sql_db"], config["sql_host"]).then(DB => { + DB.connect(config["sql_user"], config["sql_pwd"], config["sql_db"], config["sql_host"]).then(_ => { let txQueries = data.split(';'); txQueries.pop(); txQueries = txQueries.map(q => q.trim().replace(/\n/g, ' ')); diff --git a/setup/reset-password.js b/setup/reset-password.js index 9fd6c3d..04bd5c3 100644 --- a/setup/reset-password.js +++ b/setup/reset-password.js @@ -5,8 +5,7 @@ global.floGlobals = require('../docs/scripts/floGlobals'); require('../src/set_globals'); require('../docs/scripts/lib'); const floCrypto = require('../docs/scripts/floCrypto'); - -console.log(__dirname); +const path = require('path'); let _I = ""; for (let arg of process.argv) @@ -69,7 +68,7 @@ function resetPassword() { let encrypted = Crypto.AES.encrypt(privKey, password); let randNum = floCrypto.randInt(10, 15); let splitShares = floCrypto.createShamirsSecretShares(encrypted, randNum, randNum); - fs.writeFile(__dirname + `/../args/keys${_I}.json`, JSON.stringify(splitShares), 'utf8', (err) => { + fs.writeFile(path.resolve(__dirname, '..', 'args', `keys${_I}.json`), JSON.stringify(splitShares), 'utf8', (err) => { if (err) { console.error(err); return reject(false); diff --git a/src/app.js b/src/app.js index 7e74db6..a97b52e 100644 --- a/src/app.js +++ b/src/app.js @@ -3,11 +3,13 @@ const express = require('express'); //const cookieParser = require("cookie-parser"); //const sessions = require('express-session'); const Request = require('./request'); +const path = require('path'); +const PUBLIC_DIR = path.resolve(__dirname, '..', 'docs'); -module.exports = function App(secret, DB) { +module.exports = function App(secret) { if (!(this instanceof App)) - return new App(secret, DB); + return new App(secret); var server = null; const app = express(); @@ -103,7 +105,6 @@ module.exports = function App(secret, DB) { app.post('/add-distributor', Request.AddDistributor); app.post('/remove-distributor', Request.RemoveDistributor); - Request.DB = DB; Request.secret = secret; //Properties diff --git a/src/background.js b/src/background.js index a5acb23..5962dc5 100644 --- a/src/background.js +++ b/src/background.js @@ -4,6 +4,7 @@ const conversion_rates = require('./services/conversion').getRate; const bond_util = require('./services/bonds').util; const fund_util = require('./services/bobs-fund').util; const pCode = require('../docs/scripts/floExchangeAPI').processCode; +const DB = require("./database"); const { LAUNCH_SELLER_TAG, @@ -11,7 +12,7 @@ const { REQUEST_TIMEOUT, } = require('./_constants')["market"]; -var DB, assetList; //container for database and allowed assets +var assetList; //container and allowed assets var updateBalance; // container for updateBalance function const verifyTx = {}; @@ -506,10 +507,6 @@ module.exports = { set assetList(assets) { assetList = assets; }, - set DB(db) { - DB = db; - blockchain.DB = db; - }, set updateBalance(f) { updateBalance = f; } diff --git a/src/backup/head.js b/src/backup/head.js index 7447f63..7647388 100644 --- a/src/backup/head.js +++ b/src/backup/head.js @@ -4,12 +4,13 @@ const K_Bucket = require('../../docs/scripts/floExchangeAPI').K_Bucket; const slave = require('./slave'); const sync = require('./sync'); const WebSocket = require('ws'); +const DB = require("../database"); const { SHARE_THRESHOLD } = require("../_constants")["backup"]; -var DB, app, wss, tokenList; //Container for database and app +var app, wss, tokenList; //Container for app and wss var nodeList, nodeURL, nodeKBucket; //Container for (backup) node list const connectedSlaves = {}, shares_collected = {}, @@ -381,11 +382,6 @@ module.exports = { set assetList(assets) { tokenList = assets.filter(a => a.toUpperCase() !== "FLO"); }, - set DB(db) { - DB = db; - sync.DB = db; - slave.DB = db; - }, get wss() { return wss; } diff --git a/src/backup/slave.js b/src/backup/slave.js index d02e99e..55eae2f 100644 --- a/src/backup/slave.js +++ b/src/backup/slave.js @@ -1,5 +1,7 @@ 'use strict'; +const DB = require("../database"); + const { BACKUP_INTERVAL, BACKUP_SYNC_TIMEOUT, @@ -7,7 +9,6 @@ const { HASH_N_ROW } = require("../_constants")["backup"]; -var DB; //Container for Database connection var masterWS = null; //Container for Master websocket connection var intervalID = null; @@ -161,7 +162,7 @@ function storeSinkShare(sinkID, keyShare, decrypt = true) { function sendSinkShare(sinkID, pubKey) { DB.query("SELECT share FROM sinkShares WHERE floID=?", [sinkID]).then(result => { if (!result.length) - return console.warn(`key-shares for ${sinkID} not found in DB!`); + return console.warn(`key-shares for ${sinkID} not found in database!`); let share = Crypto.AES.decrypt(result[0].share, global.myPrivKey); let response = { type: "SINK_SHARE", @@ -421,9 +422,6 @@ function requestTableChunks(tables, ws) { } module.exports = { - set DB(db) { - DB = db; - }, get masterWS() { return masterWS; }, diff --git a/src/backup/sync.js b/src/backup/sync.js index e7f1e7e..0f3f7d4 100644 --- a/src/backup/sync.js +++ b/src/backup/sync.js @@ -1,11 +1,11 @@ 'use strict'; +const DB = require("../database"); + const { HASH_N_ROW } = require("../_constants")["backup"]; -var DB; //Container for database - //Backup Transfer function sendBackupData(last_time, checksum, ws) { if (!last_time) last_time = 0; @@ -263,8 +263,5 @@ function tableSync_checksum(tables, ws) { module.exports = { sendBackupData, sendTableHash, - sendTableData, - set DB(db) { - DB = db; - } + sendTableData } \ No newline at end of file diff --git a/src/blockchain.js b/src/blockchain.js index 13aec35..138f70e 100644 --- a/src/blockchain.js +++ b/src/blockchain.js @@ -1,10 +1,10 @@ 'use strict'; const pCode = require('../docs/scripts/floExchangeAPI').processCode; +const DB = require("./database"); var collectAndCall; //container for collectAndCall function from backup module var chests; //container for blockchain ids (where assets are stored) -var DB; //container for database const TYPE_VAULT = "VAULT", TYPE_CONVERT = "CONVERT", @@ -102,7 +102,7 @@ function sendAsset(floID, asset, quantity, type, id) { sendTx(floID, asset, quantity, sinkID, sinkKey, WITHDRAWAL_MESSAGE[type]).then(txid => { if (!txid) console.error("Transaction not successful"); - else //Transaction was successful, Add in DB + else //Transaction was successful, Add in database DB.query(updateSyntax[type], [pCode.STATUS_CONFIRMATION, txid, id]) .then(_ => null).catch(error => console.error(error)); }).catch(error => console.error(error)).finally(_ => { @@ -222,8 +222,5 @@ module.exports = { refundTransact: { init: refundTransact_init, retry: refundTransact_retry - }, - set DB(db) { - DB = db; } } \ No newline at end of file diff --git a/src/coupling.js b/src/coupling.js index c9a87e8..90d3b01 100644 --- a/src/coupling.js +++ b/src/coupling.js @@ -1,14 +1,13 @@ 'use strict'; const price = require("./price"); +const DB = require("./database"); const { WAIT_TIME, TRADE_HASH_PREFIX } = require("./_constants")["market"]; -var DB; //container for database - const updateBalance = {}; updateBalance.consume = (floID, token, amount) => ["UPDATE UserBalance SET quantity=quantity-? WHERE floID=? AND token=?", [amount, floID, token]]; updateBalance.add = (floID, token, amount) => ["INSERT INTO UserBalance (floID, token, quantity) VALUE (?) ON DUPLICATE KEY UPDATE quantity=quantity+?", [[floID, token, amount], amount]]; @@ -250,9 +249,5 @@ module.exports = { initiate: startCouplingForAsset, stopAll: stopAllInstance, updateBalance, - price, - set DB(db) { - DB = db; - price.DB = db; - } + price } \ No newline at end of file diff --git a/src/database.js b/src/database.js index 89e8841..affa349 100644 --- a/src/database.js +++ b/src/database.js @@ -1,87 +1,11 @@ 'use strict'; var mysql = require('mysql'); -function Database(user, password, dbname, host = 'localhost') { - const db = {}; - - Object.defineProperty(db, "connect", { - get: () => new Promise((resolve, reject) => { - db.pool.getConnection((error, conn) => { - if (error) - reject(error); - else - resolve(conn); - }); - }) - }); - - Object.defineProperty(db, "query", { - value: (sql, values) => new Promise((resolve, reject) => { - db.connect.then(conn => { - const fn = (err, res) => { - conn.release(); - (err ? reject(err) : resolve(res)); - }; - if (values) - conn.query(sql, values, fn); - else - conn.query(sql, fn); - }).catch(error => reject(error)); - }) - }); - - Object.defineProperty(db, "transaction", { - value: (queries) => new Promise((resolve, reject) => { - db.connect.then(conn => { - conn.beginTransaction(err => { - if (err) - conn.rollback(() => { - conn.release(); - reject(err); - }); - else { - (function queryFn(result) { - if (!queries.length) { - conn.commit(err => { - if (err) - conn.rollback(() => { - conn.release(); - reject(err); - }); - else { - conn.release(); - resolve(result); - } - }); - } else { - let q_i = queries.shift(); - const callback = function(err, res) { - if (err) - conn.rollback(() => { - conn.release(); - reject(err); - }); - else { - result.push(res); - queryFn(result); - } - }; - if (!Array.isArray(q_i)) - q_i = [q_i]; - if (q_i[1]) - conn.query(q_i[0], q_i[1], callback); - else - conn.query(q_i[0], callback); - } - })([]); - } - }); - }).catch(error => reject(error)); - }) - }); +var pool;//container for connected pool; +function connectToDatabase(user, password, dbname, host = 'localhost') { return new Promise((resolve, reject) => { - db.pool = mysql.createPool({ + pool = mysql.createPool({ host: host, user: user, password: password, @@ -89,11 +13,92 @@ function Database(user, password, dbname, host = 'localhost') { //dateStrings : true, //timezone: 'UTC' }); - db.connect.then(conn => { + getConnection().then(conn => { conn.release(); - resolve(db); + resolve(pool); }).catch(error => reject(error)); }); } -module.exports = Database; \ No newline at end of file +function getConnection() { + return new Promise((resolve, reject) => { + if (!pool) + return reject("Database not connected"); + pool.getConnection((error, conn) => { + if (error) + reject(error); + else + resolve(conn); + }); + }) +} + +function SQL_query(sql, values) { + return new Promise((resolve, reject) => { + getConnection().then(conn => { + const fn = (err, res) => { + conn.release(); + (err ? reject(err) : resolve(res)); + }; + if (values) + conn.query(sql, values, fn); + else + conn.query(sql, fn); + }).catch(error => reject(error)); + }) +} + +function SQL_transaction(queries) { + return new Promise((resolve, reject) => { + getConnection().then(conn => { + conn.beginTransaction(err => { + if (err) + conn.rollback(() => { + conn.release(); + reject(err); + }); + else { + (function queryFn(result) { + if (!queries.length) { + conn.commit(err => { + if (err) + conn.rollback(() => { + conn.release(); + reject(err); + }); + else { + conn.release(); + resolve(result); + } + }); + } else { + let q_i = queries.shift(); + const callback = function (err, res) { + if (err) + conn.rollback(() => { + conn.release(); + reject(err); + }); + else { + result.push(res); + queryFn(result); + } + }; + if (!Array.isArray(q_i)) + q_i = [q_i]; + if (q_i[1]) + conn.query(q_i[0], q_i[1], callback); + else + conn.query(q_i[0], callback); + } + })([]); + } + }); + }).catch(error => reject(error)); + }) +} +module.exports = { + connect: connectToDatabase, + query: SQL_query, + transaction: SQL_transaction +}; \ No newline at end of file diff --git a/src/main.js b/src/main.js index e92dc41..26bf63b 100644 --- a/src/main.js +++ b/src/main.js @@ -13,7 +13,7 @@ global.btcOperator = require('../docs/scripts/btcOperator'); floGlobals.application = application; })(); -const Database = require("./database"); +const DB = require("./database"); const App = require('./app'); const backup = require('./backup/head'); @@ -22,7 +22,7 @@ const { BLOCKCHAIN_REFRESH_INTERVAL } = require("./_constants")["app"]; -var DB, app; +var app; function refreshData(startup = false) { return new Promise((resolve, reject) => { @@ -162,12 +162,7 @@ loadDataFromDB.trustedIDs = function () { }) } -function setDB(db) { - DB = db; - backup.DB = DB; -} - -module.exports = function startServer(public_dir) { +module.exports = function startServer() { let _pass, _I = ""; for (let arg of process.argv) { if (/^-I=/.test(arg)) @@ -193,12 +188,10 @@ module.exports = function startServer(public_dir) { process.exit(1); } - global.PUBLIC_DIR = public_dir; console.log("Logged in as", global.myFloID); - Database(config["sql_user"], config["sql_pwd"], config["sql_db"], config["sql_host"]).then(db => { - setDB(db); - app = new App(config['secret'], DB); + DB.connect(config["sql_user"], config["sql_pwd"], config["sql_db"], config["sql_host"]).then(result => { + app = new App(config['secret']); refreshData(true).then(_ => { app.start(config['port']).then(result => { console.log(result); diff --git a/src/market.js b/src/market.js index 8959692..f23c04f 100644 --- a/src/market.js +++ b/src/market.js @@ -2,6 +2,7 @@ const coupling = require('./coupling'); const background = require('./background'); +const DB = require("./database"); const blockchain = background.blockchain; @@ -17,7 +18,7 @@ const pCode = require('../docs/scripts/floExchangeAPI').processCode; const updateBalance = background.updateBalance = coupling.updateBalance; -var DB, assetList; //container for database and allowed assets +var assetList; //container for allowed assets function login(floID, proxyKey) { return new Promise((resolve, reject) => { @@ -542,11 +543,6 @@ module.exports = { start: periodicProcess_start, stop: periodicProcess_stop }, - set DB(db) { - DB = db; - coupling.DB = db; - background.DB = db; - }, set assetList(assets) { assetList = assets; background.assetList = assets; diff --git a/src/price.js b/src/price.js index 4c43924..2752a56 100644 --- a/src/price.js +++ b/src/price.js @@ -1,4 +1,5 @@ 'use strict'; +const DB = require("./database"); const { MIN_TIME, @@ -11,8 +12,6 @@ const { REC_HISTORY_INTERVAL } = require("./_constants")["price"]; -var DB; //container for database - var currentRate = {}, //container for FLO price (from API or by model) lastTime = {}, //container for timestamp of the last tx noBuyOrder = {}, @@ -20,7 +19,7 @@ var currentRate = {}, //container for FLO price (from API or by model) const updateLastTime = asset => lastTime[asset] = Date.now(); -//store FLO price in DB every 1 hr +//store FLO price in database every 1 hr function storeHistory(asset, rate) { DB.query("INSERT INTO PriceHistory (asset, rate) VALUE (?)", [[asset, global.toStandardDecimal(rate)]]) .then(_ => null).catch(error => console.error(error)) @@ -173,9 +172,6 @@ module.exports = { noBuyOrder[asset] = buy; noSellOrder[asset] = sell; }, - set DB(db) { - DB = db; - }, get currentRates() { return Object.assign({}, currentRate); }, diff --git a/src/request.js b/src/request.js index 71e3f34..03e997c 100644 --- a/src/request.js +++ b/src/request.js @@ -1,4 +1,5 @@ 'use strict'; +const DB = require("./database"); const market = require("./market"); const conversion = require('./services/conversion'); @@ -12,7 +13,7 @@ const { const eCode = require('../docs/scripts/floExchangeAPI').errorCode; -var DB, trustedIDs, secret; //container for database +var trustedIDs, secret; //containers for trusted IDs and secret global.INVALID = function (ecode, message) { if (!(this instanceof INVALID)) @@ -619,13 +620,6 @@ module.exports = { set collectAndCall(fn) { market.collectAndCall = fn; }, - set DB(db) { - DB = db; - market.DB = db; - conversion.DB = db; - blockchain_bonds.DB = db; - bobs_fund.DB = db; - }, set secret(s) { secret = s; }, diff --git a/src/services/bobs-fund.js b/src/services/bobs-fund.js index 7c90a08..23f4eb9 100644 --- a/src/services/bobs-fund.js +++ b/src/services/bobs-fund.js @@ -1,11 +1,10 @@ 'use strict'; +const DB = require("../database"); const eCode = require('../../docs/scripts/floExchangeAPI').errorCode; const pCode = require('../../docs/scripts/floExchangeAPI').processCode; const getRate = require('./conversion').getRate; -var DB; //container for database - const bobsFund = (function () { const productStr = "Bobs Fund"; @@ -302,9 +301,6 @@ module.exports = { .then(result => console.debug("Refreshed Bob's Fund data")) .catch(error => console.error(error)); }, - set DB(db) { - DB = db; - }, util: bobsFund, closeFund } \ No newline at end of file diff --git a/src/services/bonds.js b/src/services/bonds.js index 7808ea4..5d41041 100644 --- a/src/services/bonds.js +++ b/src/services/bonds.js @@ -1,11 +1,10 @@ 'use strict'; +const DB = require("../database"); const eCode = require('../../docs/scripts/floExchangeAPI').errorCode; const pCode = require('../../docs/scripts/floExchangeAPI').processCode; const getRate = require('./conversion').getRate; -var DB; //container for database - const blockchainBond = (function () { const productStr = "Product: RanchiMall Bitcoin Bond"; @@ -255,9 +254,6 @@ module.exports = { .then(result => console.debug("Refreshed Blockchain-bonds data")) .catch(error => console.error(error)); }, - set DB(db) { - DB = db; - }, util: blockchainBond, closeBond } \ No newline at end of file diff --git a/src/services/conversion.js b/src/services/conversion.js index 38b38d0..d548801 100644 --- a/src/services/conversion.js +++ b/src/services/conversion.js @@ -1,13 +1,12 @@ 'use strict'; +const DB = require("../database"); const { MIN_FUND } = require('../_constants')['convert']; const eCode = require('../../docs/scripts/floExchangeAPI').errorCode; const pCode = require('../../docs/scripts/floExchangeAPI').processCode; const allowedConversion = ["BTC"]; -var DB; //container for database - function BTC_INR() { return new Promise((resolve, reject) => { BTC_USD().then(btc_usd => { @@ -219,8 +218,5 @@ module.exports = { withdrawFund: { coin: withdrawCoinFund, currency: withdrawCurrencyFund - }, - set DB(db) { - DB = db; } } \ No newline at end of file diff --git a/start.js b/start.js index 0339217..32915f3 100644 --- a/start.js +++ b/start.js @@ -1,4 +1,2 @@ -const PUBLIC_DIR = __dirname + "/public"; - const start = require('./src/main'); -start(PUBLIC_DIR); \ No newline at end of file +start(); \ No newline at end of file