@joktec/mysql
Version:
JokTec - MySql Service
126 lines • 5.64 kB
JavaScript
;
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