From 0d35162de058c3814146b84afcc75cdbbc7b0e96 Mon Sep 17 00:00:00 2001 From: AlloVince Date: Sat, 8 Aug 2026 21:06:59 +0800 Subject: [PATCH] fix: bug --- package.json | 2 +- src/entities/index.js | 2 +- src/middlewares/view_cache.js | 3 +- src/swagger/index.js | 3 +- src/utils/smart_query.js | 14 ++++++- test/utils/smart_query.js | 78 +++++++++++++++++++++-------------- 6 files changed, 65 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 3bf8645..dd6c938 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "evaengine", - "version": "0.11.2", + "version": "0.0.0-development", "description": "EvaEngine for Node.js, a micro service development engine", "license": "MIT", "type": "module", diff --git a/src/entities/index.js b/src/entities/index.js index dc573c6..ae4fa78 100644 --- a/src/entities/index.js +++ b/src/entities/index.js @@ -22,7 +22,7 @@ Sequelize.prototype.validateIsUnique = (col, msg) => { .keys(schema) .filter(field => schema[field].primaryKey) .forEach((pk) => { - conditions.where[pk] = { $ne: self[pk] }; + conditions.where[pk] = { [Sequelize.Op.ne]: self[pk] }; }); }).then(() => self.Model.count(conditions).then((found) => { diff --git a/src/middlewares/view_cache.js b/src/middlewares/view_cache.js index 4e70c27..a087aa0 100644 --- a/src/middlewares/view_cache.js +++ b/src/middlewares/view_cache.js @@ -1,6 +1,5 @@ import constitute from 'constitute'; import crypto from 'crypto'; -import util from 'util'; import moment from 'moment-timezone'; import Logger from '../services/logger.js'; import Cache from '../services/cache.js'; @@ -65,7 +64,7 @@ export const requestToCacheKey = (req, hashStrategy) => { */ function ViewCacheMiddleware(cache, logger) { return (options = {}) => { - if (!util.isObject(options)) { + if (options === null || typeof options !== 'object') { options = { ttl: options }; diff --git a/src/swagger/index.js b/src/swagger/index.js index ff8d342..7efd6ba 100644 --- a/src/swagger/index.js +++ b/src/swagger/index.js @@ -433,7 +433,8 @@ export class ExSwagger { const source = await fs.readFileSync(file); try { acorn.parse(source, { - ecmaVersion: 9, + ecmaVersion: 'latest', + sourceType: 'module', allowImportExportEverywhere: true, onComment: comments }); diff --git a/src/utils/smart_query.js b/src/utils/smart_query.js index 9062c93..ebcce7b 100644 --- a/src/utils/smart_query.js +++ b/src/utils/smart_query.js @@ -1,6 +1,16 @@ import moment from 'moment-timezone'; +import { Op } from 'sequelize'; import { InvalidArgumentException } from '../exceptions/index.js'; +const OPERATORS = { + $eq: Op.eq, + $like: Op.like, + $in: Op.in, + $notIn: Op.notIn, + $gte: Op.gte, + $lte: Op.lte +}; + /** * 自动根据 req.query 生成 sequelize 查询条件, 自动判断参数清单中是否有值 */ @@ -265,7 +275,7 @@ export default class SmartQuery { criteria.order = this.order; } - if (this.where instanceof Object && this.where.length > 0) { + if (Object.keys(this.where).length > 0) { criteria.where = this.where; } @@ -311,7 +321,7 @@ export default class SmartQuery { if (!Object.keys(this.where).includes(filedName)) { this.where[filedName] = {}; } - this.where[filedName][predicate] = value; + this.where[filedName][OPERATORS[predicate] || predicate] = value; } /** diff --git a/test/utils/smart_query.js b/test/utils/smart_query.js index 082ff34..d445319 100644 --- a/test/utils/smart_query.js +++ b/test/utils/smart_query.js @@ -1,5 +1,6 @@ import test from 'ava'; import moment from 'moment-timezone'; +import { Op } from 'sequelize'; import SmartQuery from '../../src/utils/smart_query.js'; moment.tz.setDefault('Asia/Shanghai'); @@ -7,11 +8,11 @@ moment.tz.setDefault('Asia/Shanghai'); test('SmartQuery: equal', (t) => { t.deepEqual( new SmartQuery({ title: 'foo', redundant: 'bar' }).equal('title').where, - { title: { '$eq': 'foo' } } + { title: { [Op.eq]: 'foo' } } ); t.deepEqual( new SmartQuery({ title: 'foo', redundant: 'bar' }).equal('title').equal('content').where, - { title: { '$eq': 'foo' } } + { title: { [Op.eq]: 'foo' } } ); // test default value t.deepEqual( @@ -19,97 +20,97 @@ test('SmartQuery: equal', (t) => { title: 'foo', redundant: 'bar' }).equal('title').equal('content', 'content', 'defaultContent').where, - { title: { '$eq': 'foo' }, content: { '$eq': 'defaultContent' } } + { title: { [Op.eq]: 'foo' }, content: { [Op.eq]: 'defaultContent' } } ); }); test('SmartQuery: like', (t) => { t.deepEqual( new SmartQuery({ title: 'foo', redundant: 'bar' }).like('title').where, - { title: { '$like': '%foo%' } } + { title: { [Op.like]: '%foo%' } } ); // test default value t.deepEqual( new SmartQuery({ titlex: 'foo', redundant: 'bar' }).like('title', 'title', 'defaultTitle').where, - { title: { '$like': '%defaultTitle%' } } + { title: { [Op.like]: '%defaultTitle%' } } ); }); test('SmartQuery: startsWith', (t) => { t.deepEqual( new SmartQuery({ title: 'foo', redundant: 'bar' }).startsWith('title').where, - { title: { '$like': 'foo%' } } + { title: { [Op.like]: 'foo%' } } ); // test default value t.deepEqual( new SmartQuery({ titlex: 'foo', redundant: 'bar' }).startsWith('title', 'title', 'defaultTitle').where, - { title: { '$like': 'defaultTitle%' } } + { title: { [Op.like]: 'defaultTitle%' } } ); }); test('SmartQuery: endsWith', (t) => { t.deepEqual( new SmartQuery({ title: 'foo', redundant: 'bar' }).endsWith('title').where, - { title: { '$like': '%foo' } } + { title: { [Op.like]: '%foo' } } ); // test default value t.deepEqual( new SmartQuery({ titlex: 'foo', redundant: 'bar' }).endsWith('title', 'title', 'defaultTitle').where, - { title: { '$like': '%defaultTitle' } } + { title: { [Op.like]: '%defaultTitle' } } ); }); test('SmartQuery: gte', (t) => { t.deepEqual( new SmartQuery({ created_starts: 12345 }).gte('created_starts', 'createdAt').where, - { createdAt: { '$gte': 12345 } } + { createdAt: { [Op.gte]: 12345 } } ); }); test('SmartQuery: lte', (t) => { t.deepEqual( new SmartQuery({ created_ends: 12345 }).lte('created_ends', 'createdAt').where, - { createdAt: { '$lte': 12345 } } + { createdAt: { [Op.lte]: 12345 } } ); }); test('SmartQuery: in', (t) => { t.deepEqual( new SmartQuery({ uids: '3,4', redundant: 'bar' }).in('uids', 'userId').where, - { userId: { '$in': ['3', '4'] } } + { userId: { [Op.in]: ['3', '4'] } } ); t.deepEqual( new SmartQuery({ status: ['pending', 'deleted'], redundant: 'bar' }).in('status').where, - { status: { '$in': ['pending', 'deleted'] } } + { status: { [Op.in]: ['pending', 'deleted'] } } ); // test default value t.deepEqual( new SmartQuery({ redundant: 'bar' }).in('status', 'status', 'published,approved').where, - { status: { '$in': ['published', 'approved'] } } + { status: { [Op.in]: ['published', 'approved'] } } ); }); test('SmartQuery: notIn', (t) => { t.deepEqual( new SmartQuery({ uids: '3,4', redundant: 'bar' }).notIn('uids', 'userId').where, - { userId: { '$notIn': ['3', '4'] } } + { userId: { [Op.notIn]: ['3', '4'] } } ); t.deepEqual( new SmartQuery({ uids: [3, 4], redundant: 'bar' }).notIn('uids', 'userId').where, - { userId: { '$notIn': [3, 4] } } + { userId: { [Op.notIn]: [3, 4] } } ); }); test('SmartQuery: range', (t) => { t.deepEqual( new SmartQuery({ minUid: 3, maxUid: 4 }).range('minUid', 'maxUid', 'userId').where, - { userId: { '$gte': 3, '$lte': 4 } } + { userId: { [Op.gte]: 3, [Op.lte]: 4 } } ); t.deepEqual( new SmartQuery({ minUid: 3 }).range('minUid', 'maxUid', 'userId').where, - { userId: { '$gte': 3 } } + { userId: { [Op.gte]: 3 } } ); t.deepEqual( new SmartQuery({ maxUid: 4 }).range('minUid', 'maxUid', 'userId').where, - { userId: { '$lte': 4 } } + { userId: { [Op.lte]: 4 } } ); }); @@ -119,26 +120,26 @@ test('SmartQuery: dateRange', (t) => { createdStart: '2016-01-01', createdEnd: '2016-01-01' }).dateRange('createdStart', 'createdEnd', 'createdAt').where, - { createdAt: { '$gte': '1451577600', '$lte': '1451663999' } } + { createdAt: { [Op.gte]: '1451577600', [Op.lte]: '1451663999' } } ); t.deepEqual( new SmartQuery({ createdStart: '2016-01-01' }).dateRange('createdStart', 'createdEnd', 'createdAt').where, - { createdAt: { '$gte': '1451577600' } } + { createdAt: { [Op.gte]: '1451577600' } } ); t.deepEqual( new SmartQuery({ createdEnd: '2016-01-01' }).dateRange('createdStart', 'createdEnd', 'createdAt').where, - { createdAt: { '$lte': '1451663999' } } + { createdAt: { [Op.lte]: '1451663999' } } ); t.deepEqual( new SmartQuery({ createdStart: '2016-01-01 03:05', createdEnd: '2016-01-01 04:05' }).dateRange('createdStart', 'createdEnd', 'createdAt').where, - { createdAt: { '$gte': '1451577600', '$lte': '1451663999' } } + { createdAt: { [Op.gte]: '1451577600', [Op.lte]: '1451663999' } } ); t.deepEqual( new SmartQuery({ @@ -154,7 +155,7 @@ test('SmartQuery: dateTimeRange', (t) => { createdStart: '2016-01-01', createdEnd: '2016-01-01' }).dateTimeRange('createdStart', 'createdEnd', 'createdAt').where, - { createdAt: { '$gte': '1451577600', '$lte': '1451577600' } } + { createdAt: { [Op.gte]: '1451577600', [Op.lte]: '1451577600' } } ); t.deepEqual( @@ -162,13 +163,13 @@ test('SmartQuery: dateTimeRange', (t) => { createdStart: '2016-01-01 03:05', createdEnd: '2016-01-01 12:05:03' }).dateTimeRange('createdStart', 'createdEnd', 'createdAt').where, - { createdAt: { '$gte': '1451588700', '$lte': '1451621103' } } + { createdAt: { [Op.gte]: '1451588700', [Op.lte]: '1451621103' } } ); t.deepEqual( new SmartQuery({ createdEnd: '2016-01-01 12:05:03' }).dateTimeRange('createdStart', 'createdEnd', 'createdAt').where, - { createdAt: { '$lte': '1451621103' } } + { createdAt: { [Op.lte]: '1451621103' } } ); t.deepEqual( new SmartQuery({ @@ -259,7 +260,7 @@ test('SmartQuery: applyWhere', (t) => { smartQuery.where, { title: { - '$eq': 'xxx' + [Op.eq]: 'xxx' } } ); @@ -268,7 +269,7 @@ test('SmartQuery: applyWhere', (t) => { smartQuery.where, { title: { - '$eq': 'ooo' + [Op.eq]: 'ooo' } } ); @@ -277,9 +278,26 @@ test('SmartQuery: applyWhere', (t) => { smartQuery.where, { title: { - '$eq': 'ooo', - '$in': 'bar' + [Op.eq]: 'ooo', + [Op.in]: 'bar' } } ); }); + +test('SmartQuery: getCriteria includes where and order', (t) => { + const smartQuery = new SmartQuery({ title: 'foo' }); + smartQuery.like('title').orderable(['createdAt'], {}, ['id', 'DESC']); + t.deepEqual( + smartQuery.getCriteria(), + { + where: { title: { [Op.like]: '%foo%' } }, + order: [['id', 'DESC']] + } + ); +}); + +test('SmartQuery: getCriteria returns empty without conditions', (t) => { + const smartQuery = new SmartQuery({}); + t.deepEqual(smartQuery.getCriteria(), {}); +});