UNPKG

@starbemtech/star-db-query-builder

Version:

A query builder to be used with mysql or postgres

192 lines 8.04 kB
"use strict"; 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