Skip to content

Commit e5d9920

Browse files
authored
feat: Add releasing/executing multi-query support (#14)
* Rework query-face-template * Tried to make it more readable and effective * Rename as validate-query-template * Add centralized errors management * Rework query-face * Tried to make it more readable and effective * Move some functionst to separate helper files * Update errors * Add whitelistRoutes for devMode * feat: Add anonymous routes to allow testing query * Any logged-in user can test query * feat: Add parameter validations for queries * fix: Remove unnecessary packages * feat: Add releasing/executing multi-query support Add initial data Update qf migrations feat: Add dependent param default value
1 parent 8f8e01c commit e5d9920

26 files changed

+1136
-916
lines changed

.jsdoc/node/find-versions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ module.exports = function() {
66
fs.readFileSync(path.join(__dirname, '..', '..', 'package.json'), 'utf8')
77
);
88

9-
require('child_process').exec('git tag -l', (err, stdOut) => {
9+
require('child_process').execSync('git tag -l', (err, stdOut) => {
1010
let versions = [pkg.version];
1111
if (err) {
1212
console.log(err);

docs/query-face-node/1.0/queryFaceNode.html

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ <h3></h3>
8080
<li class="doc-function">
8181
<a href="queryFaceNode.html#.setDatabase">setDatabase</a>
8282
</li>
83+
<li class="doc-function">
84+
<a href="queryFaceNode.html#.setMainDatabase">setMainDatabase</a>
85+
</li>
8386
<li class="doc-function">
8487
<a href="queryFaceNode.html#.upMigrations">upMigrations</a>
8588
</li>
@@ -921,6 +924,72 @@ <h5>Example</h5>
921924
const databases = require('./databases');
922925
queryFaceNode.setDatabase('todoDB', databases.todoDB);</code></pre>
923926

927+
<h4 class="name" id=".setMainDatabase">
928+
<span class="type-signature">(static) </span>setMainDatabase<span
929+
class="signature"
930+
>(database)</span
931+
><span class="type-signature"></span>
932+
</h4>
933+
934+
<h5>Parameters:</h5>
935+
936+
<table class="params">
937+
<thead>
938+
<tr>
939+
<th>Name</th>
940+
941+
<th>Type</th>
942+
943+
<th class="last">Description</th>
944+
</tr>
945+
</thead>
946+
947+
<tbody>
948+
<tr>
949+
<td class="name"><code>database</code></td>
950+
951+
<td class="type">
952+
<span class="param-type">knex</span>
953+
</td>
954+
955+
<td class="description last">
956+
knex database instance you configured to use qf db operations
957+
</td>
958+
</tr>
959+
</tbody>
960+
</table>
961+
962+
<dl class="details"></dl>
963+
964+
<h5>Example</h5>
965+
966+
<pre class="prettyprint"><code>// somewhere in your project
967+
// databases.js
968+
require('dotenv').config();
969+
module.exports = {
970+
mainDB: require('knex')({
971+
client: process.env.QF_DB_CLIENT,
972+
connection: {
973+
host: process.env.QF_DB_HOST,
974+
port: process.env.QF_DB_PORT,
975+
user: process.env.QF_DB_USER,
976+
password: process.env.QF_DB_PASSWORD,
977+
database: process.env.QF_DB_DATABASE
978+
},
979+
migrations: {
980+
tableName: process.env.QF_DB_MIGRATION_TABLE,
981+
directory: process.env.QF_DB_MIGRATION_DIRECTORY
982+
},
983+
seeds: {
984+
directory: process.env.QF_DB_SEEDS_DIRECTORY
985+
}
986+
})
987+
};
988+
989+
// app.js
990+
const databases = require('./databases');
991+
queryFaceNode.setMainDatabase(databases.mainDB);</code></pre>
992+
924993
<h4 class="name" id=".upMigrations">
925994
<span class="type-signature">(static) </span>upMigrations<span
926995
class="signature"

index.js

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const router = require('./lib/middleware/router');
2-
const setDatabase = require('./lib/databases').setDatabase;
2+
const { setDatabase, setMainDatabase } = require('./lib/databases');
33
const {
44
runMigrations,
55
listMigrations,
@@ -66,6 +66,40 @@ module.exports = router;
6666
*/
6767
module.exports.setDatabase = setDatabase;
6868

69+
/**
70+
* @memberof queryFaceNode.
71+
* @function setMainDatabase
72+
* @param {knex} database knex database instance you configured to use qf db operations
73+
* @example
74+
* // somewhere in your project
75+
* // databases.js
76+
* require('dotenv').config();
77+
* module.exports = {
78+
* mainDB: require('knex')({
79+
* client: process.env.QF_DB_CLIENT,
80+
* connection: {
81+
* host: process.env.QF_DB_HOST,
82+
* port: process.env.QF_DB_PORT,
83+
* user: process.env.QF_DB_USER,
84+
* password: process.env.QF_DB_PASSWORD,
85+
* database: process.env.QF_DB_DATABASE
86+
* },
87+
* migrations: {
88+
* tableName: process.env.QF_DB_MIGRATION_TABLE,
89+
* directory: process.env.QF_DB_MIGRATION_DIRECTORY
90+
* },
91+
* seeds: {
92+
* directory: process.env.QF_DB_SEEDS_DIRECTORY
93+
* }
94+
* })
95+
* };
96+
*
97+
* // app.js
98+
* const databases = require('./databases');
99+
* queryFaceNode.setMainDatabase(databases.mainDB);
100+
*/
101+
module.exports.setMainDatabase = setMainDatabase;
102+
69103
/**
70104
* @memberof queryFaceNode.
71105
* @function runMigrations

lib/common/constants.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const MAIN_DB_NAME = 'qfdb';
2+
const aliasRegex = /\{\{([a-zA-Z_$][0-9a-zA-Z_$]*)\.([a-zA-Z_$][0-9a-zA-Z_$]*)(:(.*))?\}\}/;
3+
const aliasRegexG = new RegExp(aliasRegex, 'g');
4+
const paramRegex = /\$\{([_a-zA-Z\s]+)\}/;
5+
const paramPrefixMap = {
6+
QF_CONST: 'qfc',
7+
};
8+
const queryMap = {
9+
delete: 'from',
10+
update: 'from',
11+
set: 'update',
12+
};
13+
14+
const whitelistRoutes = ['get-tables'];
15+
const anonymousRoutes = ['test-query'];
16+
17+
module.exports = {
18+
MAIN_DB_NAME,
19+
aliasRegexG,
20+
aliasRegex,
21+
anonymousRoutes,
22+
paramRegex,
23+
paramPrefixMap,
24+
queryMap,
25+
whitelistRoutes,
26+
};

lib/databases.js

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,31 @@
1+
const path = require('path');
12
const databaseMap = {};
3+
const setDatabase = (dbName, knexDB) => {
4+
databaseMap[dbName] = knexDB;
5+
};
6+
const setMainDatabase = knexDB => {
7+
databaseMap.qfdb = knexDB;
8+
};
9+
// try to parse consumer's databases file
10+
try {
11+
const databases = require(path.join(process.cwd(), 'src', 'databases.js'));
12+
if (databases) {
13+
Object.entries(databases).forEach(([name, db]) => {
14+
if (name && db) {
15+
if (name === 'qfdb') {
16+
setMainDatabase(db);
17+
console.log(`[qfdb] MAIN database is set automatically`);
18+
} else {
19+
setDatabase(name, db);
20+
console.log(`[${name}] database is set automatically`);
21+
}
22+
}
23+
});
24+
}
25+
} catch (error) {}
226

327
module.exports = {
428
getDatabase: dbName => databaseMap[dbName],
5-
setDatabase: (dbName, knexDB) => {
6-
databaseMap[dbName] = knexDB;
7-
},
29+
setDatabase,
30+
setMainDatabase,
831
};

0 commit comments

Comments
 (0)