@starbemtech/star-db-query-builder
Version:
A query builder to be used with mysql or postgres
192 lines • 8.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.joins = exports.deleteMany = exports.deleteOne = exports.update = exports.insert = exports.findMany = exports.findFirst = void 0;
const uuid_1 = require("uuid");
const utils_1 = require("./utils");
const findFirst = async ({ tableName, dbClient, select, where, groupBy, orderBy, }) => {
if (!tableName)
throw new Error('Table name is required');
if (!dbClient)
throw new Error('DB client is required');
const fields = (0, utils_1.createSelectFields)(select, dbClient.clientType);
const [whereClause, params] = (0, utils_1.createWhereClause)(where, 1, dbClient.clientType);
const orderByClause = (0, utils_1.createOrderByClause)(orderBy);
const groupByClause = (0, utils_1.createGroupByClause)(groupBy);
const rows = await dbClient.query(`SELECT ${fields} FROM ${tableName}
${whereClause.length > 7 ? whereClause : ''}
${groupByClause}
${orderByClause}
`, params);
return rows[0] || null;
};
exports.findFirst = findFirst;
const findMany = async ({ tableName, dbClient, select, where, groupBy, orderBy, limit, offset, unaccent, }) => {
if (!tableName)
throw new Error('Table name is required');
if (!dbClient)
throw new Error('DB client is required');
const fields = (0, utils_1.createSelectFields)(select, dbClient.clientType);
const [whereClause, params] = (0, utils_1.createWhereClause)(where, 1, dbClient.clientType, unaccent);
const orderByClause = (0, utils_1.createOrderByClause)(orderBy);
const groupByClause = (0, utils_1.createGroupByClause)(groupBy);
const limitClause = (0, utils_1.createLimitClause)(limit);
const offsetClause = (0, utils_1.createOffsetClause)(offset);
const rows = await dbClient.query(`SELECT ${fields} FROM ${tableName}
${whereClause.length > 7 ? whereClause : ''}
${groupByClause}
${orderByClause}
${limitClause}
${offsetClause}
`, params);
return rows || [];
};
exports.findMany = findMany;
const insert = async ({ tableName, dbClient, data, returning, }) => {
if (!tableName)
throw new Error('Table name is required');
if (!dbClient)
throw new Error('DB client is required');
if (!data)
throw new Error('Data object is required');
const keys = dbClient.clientType === 'pg'
? Object.keys(data).map((key) => key === 'authorization' ? `"${key}"` : key)
: Object.keys(data);
const values = Object.values(data);
keys.unshift('id');
const generatedUUID = (0, uuid_1.v4)();
values.unshift(generatedUUID);
keys.push('updated_at');
values.push(new Date());
const placeholders = (0, utils_1.generatePlaceholders)(keys, dbClient.clientType);
let query = `INSERT INTO ${tableName} (${keys.join(', ')}) VALUES (${placeholders})`;
if (dbClient.clientType === 'pg') {
if (returning && returning.length > 0) {
query += ` RETURNING ${(0, utils_1.createSelectFields)(returning, dbClient.clientType)}`;
}
}
const inserted = await dbClient.query(query, values);
if (dbClient.clientType === 'mysql') {
const rows = await dbClient.query(`SELECT ${returning && returning.length > 0
? (0, utils_1.createSelectFields)(returning, dbClient.clientType)
: '*'} FROM ${tableName}
WHERE
id = ?
`, [generatedUUID]);
return rows[0];
}
return inserted[0];
};
exports.insert = insert;
const update = async ({ tableName, dbClient, id, data, returning, }) => {
if (!tableName)
throw new Error('Table name is required');
if (!dbClient)
throw new Error('DB client is required');
if (!id)
throw new Error('ID is required');
if (!data)
throw new Error('Data object is required');
const keys = Object.keys(data);
const values = Object.values(data);
const setClause = (0, utils_1.generateSetClause)(keys, dbClient.clientType);
let query = `UPDATE ${tableName} SET ${setClause} WHERE id = '${id}'`;
if (dbClient.clientType === 'pg') {
if (returning && returning.length > 0) {
query += ` RETURNING ${(0, utils_1.createSelectFields)(returning, dbClient.clientType)}`;
}
}
const updated = await dbClient.query(query, values);
if (dbClient.clientType === 'mysql') {
const rows = await dbClient.query(`SELECT ${returning && returning.length > 0
? (0, utils_1.createSelectFields)(returning, dbClient.clientType)
: '*'} FROM ${tableName}
WHERE
id = ?
`, [id]);
return rows[0];
}
return updated[0];
};
exports.update = update;
const deleteOne = async ({ tableName, dbClient, id, permanently = false, }) => {
if (!tableName)
throw new Error('Table name is required');
if (!dbClient)
throw new Error('DB client is required');
if (!id)
throw new Error('ID is required');
await dbClient.query(permanently
? `DELETE FROM ${tableName} WHERE id = ${dbClient.clientType === 'pg' ? '$1' : '?'}`
: `UPDATE ${tableName} SET status = 'deleted' WHERE id = ${dbClient.clientType === 'pg' ? '$1' : '?'}`, [id]);
};
exports.deleteOne = deleteOne;
const deleteMany = async ({ tableName, dbClient, ids, field = 'id', permanently = false, }) => {
if (!tableName)
throw new Error('Table name is required');
if (!dbClient)
throw new Error('DB client is required');
if (!ids || ids.length === 0)
throw new Error('IDs are required and cannot be empty');
if (!field)
throw new Error('Field is required');
const placeholders = dbClient.clientType === 'pg'
? ids.map((_, index) => `$${index + 1}`).join(', ')
: ids.map(() => '?').join(', ');
const query = permanently
? `DELETE FROM ${tableName} WHERE ${field} IN (${placeholders})`
: `UPDATE ${tableName} SET status = 'deleted' WHERE ${field} IN (${placeholders})`;
await dbClient.query(query, ids);
};
exports.deleteMany = deleteMany;
const joins = async ({ tableName, dbClient, select, joins, where, groupBy, orderBy, limit, offset, unaccent, }) => {
if (!tableName)
throw new Error('Table name is required');
if (!dbClient)
throw new Error('DB client is required');
const fields = Array.isArray(select) ? select : [];
const selectFields = (0, utils_1.createSelectFields)(fields, dbClient.clientType);
const [whereClause, params] = (0, utils_1.createWhereClause)(where, 1, dbClient.clientType, unaccent);
const groupByClause = (0, utils_1.createGroupByClause)(groupBy);
const orderByClause = (0, utils_1.createOrderByClause)(orderBy);
const limitClause = (0, utils_1.createLimitClause)(limit);
const offsetClause = (0, utils_1.createOffsetClause)(offset);
const queryBuilder = {
select: [selectFields],
from: tableName,
joins: joins,
where: whereClause,
groupBy: [groupByClause],
orderBy: orderByClause,
limit: limitClause,
offset: offsetClause,
};
const queryString = await buildQuery(queryBuilder);
const rows = await dbClient.query(queryString, params);
return rows;
};
exports.joins = joins;
async function buildQuery(params) {
let queryString = `SELECT ${params.select.join(', ')} FROM ${params.from}`;
if (params.joins) {
for (const join of params.joins) {
queryString += ` ${join.type} JOIN ${join.table} ON ${join.on}`;
}
}
if (params.where) {
queryString += `${params.where}`;
}
if (params.groupBy) {
queryString += `${params.groupBy}`;
}
if (params.orderBy) {
queryString += `${params.orderBy}`;
}
if (params.limit) {
queryString += `${params.limit}`;
}
if (params.offset) {
queryString += `${params.offset}`;
}
return queryString;
}
//# sourceMappingURL=genericRepository.js.map