UNPKG

@joktec/mysql

Version:

JokTec - MySql Service

126 lines 5.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MysqlHelper = void 0; class MysqlHelper { static applyPagination(qb, query = {}) { const limit = typeof query.limit === 'number' && query.limit > 0 ? query.limit : undefined; const page = typeof query.page === 'number' && query.page > 0 ? query.page : undefined; const offset = typeof query.offset === 'number' && query.offset >= 0 ? query.offset : undefined; if (limit && page) qb.take(limit).skip((page - 1) * limit); else if (limit) qb.take(limit).skip(offset ?? 0); } static applyCondition(qb, condition) { if (!condition) return; for (const [key, value] of Object.entries(condition)) { if (key === '$or') { const orConditions = value.map((c) => MysqlHelper.buildCondition(qb, c)); qb.orWhere(orConditions.join(' OR ')); } else if (key === '$and') { const andConditions = value.map((c) => MysqlHelper.buildCondition(qb, c)); qb.andWhere(andConditions.join(' AND ')); } else { const whereClause = MysqlHelper.buildCondition(qb, { [key]: value }); qb.andWhere(whereClause); } } } static buildCondition(qb, condition) { for (const [key, value] of Object.entries(condition)) { if (typeof value === 'object') { for (const [op, val] of Object.entries(value)) { switch (op) { case '$eq': qb.andWhere(`${qb.alias}.${key} = :${key}`, { [key]: val }); break; case '$gt': qb.andWhere(`${qb.alias}.${key} > :${key}`, { [key]: val }); break; case '$gte': qb.andWhere(`${qb.alias}.${key} >= :${key}`, { [key]: val }); break; case '$lt': qb.andWhere(`${qb.alias}.${key} < :${key}`, { [key]: val }); break; case '$lte': qb.andWhere(`${qb.alias}.${key} <= :${key}`, { [key]: val }); break; case '$ne': qb.andWhere(`${qb.alias}.${key} != :${key}`, { [key]: val }); break; case '$in': qb.andWhere(`${qb.alias}.${key} IN (:...${key})`, { [key]: val }); break; case '$nin': qb.andWhere(`${qb.alias}.${key} NOT IN (:...${key})`, { [key]: val }); break; case '$all': qb.andWhere(`${qb.alias}.${key} @> ARRAY[:...${key}]`, { [key]: val }); break; case '$like': qb.andWhere(`${qb.alias}.${key} LIKE :${key}`, { [key]: `%${val}%` }); break; case '$begin': qb.andWhere(`${qb.alias}.${key} LIKE :${key}`, { [key]: `${val}%` }); break; case '$end': qb.andWhere(`${qb.alias}.${key} LIKE :${key}`, { [key]: `%${val}` }); break; case '$exists': qb.andWhere(`${qb.alias}.${key} IS NOT NULL`); break; case '$nil': qb.andWhere(`${qb.alias}.${key} IS NULL`); break; case '$empty': qb.andWhere(`${qb.alias}.${key} = ''`); break; case '$not': qb.andWhere(`${qb.alias}.${key} != :${key}`, { [key]: val }); break; case '$size': qb.andWhere(`array_length(${key}, 1) = :${key}`, { [key]: val }); break; default: throw new Error(`Unsupported operator: ${op}`); } } } else { qb.andWhere(`${qb.alias}.${key} = :${key}`, { [key]: value }); } } return qb; } static applyProjection(qb, select) { if (!select) return; const fields = Array.isArray(select) ? select : select.split(','); qb.select(fields.map(field => `${qb.alias}.${field.trim()}`)); } static applyOrder(qb, sort) { if (!sort) return; for (const [key, value] of Object.entries(sort)) { qb.addOrderBy(`${qb.alias}.${key}`, value === 'asc' ? 'ASC' : 'DESC'); } } static applyRelations(qb, populate) { if (!populate) return; for (const [relation, value] of Object.entries(populate)) { if (value === '*') { qb.leftJoinAndSelect(`${qb.alias}.${relation}`, relation); } else if (typeof value === 'object') { qb.leftJoinAndSelect(`${qb.alias}.${relation}`, relation); } } } } exports.MysqlHelper = MysqlHelper; //# sourceMappingURL=mysql.helper.js.map