Handle orWhere in mongo and format value / cast

This commit is contained in:
Alexandre Bodin 2019-03-22 17:58:36 +01:00
parent 6fcb38780d
commit f8e8928d8a
11 changed files with 42 additions and 23 deletions

View File

@ -55,4 +55,4 @@
"npm": ">= 6.0.0"
},
"license": "MIT"
}
}

View File

@ -140,9 +140,9 @@ const buildQueryJoins = (qb, { model, where }) => {
let tmpModel = model;
for (let part of parts) {
const association = tmpModel.associations.find(assoc => assoc.alias === part);
const assocModel = findModelByAssoc(association);
if (association) {
const assocModel = findModelByAssoc(association);
buildSingleJoin(qb, tmpModel, assocModel, association);
tmpModel = assocModel;
}

View File

@ -292,36 +292,55 @@ const buildQueryMatches = (model, filters) => {
return [];
};
const formatValue = value => {
if (Array.isArray(value)) {
return value.map(formatValue);
}
const number = _.toNumber(value);
if (_.isFinite(number)) return number;
return utils.valueToId(value);
};
const buildWhereClause = ({ field, operator, value }) => {
const val = formatValue(value);
if (Array.isArray(val) && !['in', 'nin'].includes(operator)) {
return {
$or: val.map(value => buildWhereClause({ field, operator, value })),
};
}
switch (operator) {
case 'eq':
return { [field]: utils.valueToId(value) };
return { [field]: val };
case 'ne':
return { [field]: { $ne: utils.valueToId(value) } };
return { [field]: { $ne: val } };
case 'lt':
return { [field]: { $lt: value } };
return { [field]: { $lt: val } };
case 'lte':
return { [field]: { $lte: value } };
return { [field]: { $lte: val } };
case 'gt':
return { [field]: { $gt: value } };
return { [field]: { $gt: val } };
case 'gte':
return { [field]: { $gte: value } };
return { [field]: { $gte: val } };
case 'in':
return {
[field]: {
$in: Array.isArray(value) ? value.map(utils.valueToId) : [utils.valueToId(value)],
$in: Array.isArray(val) ? val : [val],
},
};
case 'nin':
return {
[field]: {
$nin: Array.isArray(value) ? value.map(utils.valueToId) : [utils.valueToId(value)],
$nin: Array.isArray(val) ? val : [val],
},
};
case 'contains': {
return {
[field]: {
$regex: value,
$regex: `${val}`,
$options: 'i',
},
};
@ -329,19 +348,19 @@ const buildWhereClause = ({ field, operator, value }) => {
case 'ncontains':
return {
[field]: {
$not: new RegExp(value, 'i'),
$not: new RegExp(val, 'i'),
},
};
case 'containss':
return {
[field]: {
$regex: value,
$regex: `${val}`,
},
};
case 'ncontainss':
return {
[field]: {
$not: new RegExp(value),
$not: new RegExp(val),
},
};

View File

@ -53,4 +53,4 @@
"npm": ">= 6.0.0"
},
"license": "MIT"
}
}

View File

@ -51,4 +51,4 @@
"npm": ">= 6.0.0"
},
"license": "MIT"
}
}

View File

@ -51,4 +51,4 @@
"npm": ">= 6.0.0"
},
"license": "MIT"
}
}

View File

@ -54,4 +54,4 @@
"npm": ">= 6.0.0"
},
"license": "MIT"
}
}

View File

@ -53,4 +53,4 @@
"npm": ">= 6.0.0"
},
"license": "MIT"
}
}

View File

@ -47,4 +47,4 @@
"npm": ">= 6.0.0"
},
"license": "MIT"
}
}

View File

@ -56,4 +56,4 @@
"npm": ">= 6.0.0"
},
"license": "MIT"
}
}

View File

@ -88,7 +88,7 @@ const convertStartQueryParams = startQuery => {
const startAsANumber = _.toNumber(startQuery);
if (!_.isInteger(startAsANumber) || startAsANumber < 0) {
throw new Error(`convertStartQueryParams expected a positive integer go ${startAsANumber}`);
throw new Error(`convertStartQueryParams expected a positive integer got ${startAsANumber}`);
}
return {
@ -104,7 +104,7 @@ const convertLimitQueryParams = limitQuery => {
const limitAsANumber = _.toNumber(limitQuery);
if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {
throw new Error(`convertLimitQueryParams expected a positive integer go ${limitAsANumber}`);
throw new Error(`convertLimitQueryParams expected a positive integer got ${limitAsANumber}`);
}
return {