37 lines
1.3 KiB
JavaScript
37 lines
1.3 KiB
JavaScript
// allow Wappler to run queries on the server
|
|
|
|
const crypto = require('crypto');
|
|
const App = require("../core/app");
|
|
const config = require('./config');
|
|
|
|
module.exports = function (app) {
|
|
app.post('/_db_', async (req, res) => {
|
|
const time = req.get('auth-time');
|
|
const hash = req.get('auth-hash');
|
|
if (!time || !hash || isNaN(time)) return res.status(400).json({ error: 'Auth headers missing' });
|
|
|
|
const diff = Math.abs(Date.now() - time) / 1000;
|
|
if (diff > 60) return res.status(400).json({ error: 'Auth time diff to high' });
|
|
if (hash !== crypto.createHmac('sha256', config.secret).update(req.rawBody).digest('hex')) return res.status(400).json({ error: 'Auth hash invalid' });
|
|
|
|
const sc = new App(req, res);
|
|
const db = sc.getDbConnection(req.body.name);
|
|
|
|
let results = [];
|
|
|
|
try {
|
|
results = await db.raw(req.body.query);
|
|
} catch (error) {
|
|
return res.json({ error: error.sqlMessage });
|
|
}
|
|
|
|
if (db.client.config.client == 'mysql' || db.client.config.client == 'mysql2') {
|
|
results = results[0];
|
|
} else if (db.client.config.client == 'postgres' || db.client.config.client == 'redshift') {
|
|
results = results.rows;
|
|
}
|
|
|
|
res.json({ results });
|
|
});
|
|
}
|