gerard2p/koaton

View on GitHub
src/support/toMongooseStringQuery.js

Summary

Maintainability
B
5 hrs
Test Coverage
import inflector from './inflector';
import debug from './debug';
/** @ignore */
Function `prepareQuery` has 27 lines of code (exceeds 25 allowed). Consider refactoring.
Function `prepareQuery` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.
async function prepareQuery (database, model, query, item) {
let [modelname, property] = item.split('.');
let prequery = {};
let value = (query.value ? query.value : query[item]);
value = query.condition === '===' ? value : (property === 'id' ? value : new RegExp(`.*${value}.*`));
prequery[property] = value;
let finds = [];
if (property === 'id') {
finds = [await database[inflector.pluralize(modelname)].findById(value)];
} else {
finds = await database[inflector.pluralize(modelname)].find({
where: prequery
});
}
let term = modelname;
switch (model.relations[modelname].type) {
case 'belongsTo':
term = model.relations[modelname].keyFrom;
break;
/* istanbul ignore next */
case 'hasMany':
debug('hasMany');
TODO found
// TODO: camintejs does not allow me to do this;
break;
}
return {
key: term,
condition: 'some',
value: finds.map(m => m._id)
};
}
/** @ignore */
Function `getQuery` has 31 lines of code (exceeds 25 allowed). Consider refactoring.
Function `getQuery` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.
async function getQuery (database, model, filtergroup) {
let group = [];
for (let index in filtergroup) {
let filter = filtergroup[index];
if (filter.key.indexOf('.') > -1) {
filter = await prepareQuery(database, model, filter, filter.key);
}
if (index > 0) {
group.push(filtergroup[index - 1].link === 'or' ? '||' : '&&');
}
switch (filter.condition) {
case 'like':
group.push(`(this.${filter.key}.search(/${filter.value}/ig)>-1) `);
break;
case 'in':
group.push(`(['${filter.value.join("', '", '')}'].indexOf(this.${filter.key})>-1)`);
break;
case 'some':
group.push(`(['${filter.value.join("', '", '')}'].some(function(r){return r == that.${filter.key}}))`);
break;
case '==':
group.push(`this.${filter.key}.search('${filter.value}')>-1`);
break;
case '===':
group.push(`this.${filter.key} === '${filter.value}'`);
break;
default:
group.push(`(this.${filter.key} ${filter.condition} '${filter.value}') `);
break;
}
}
return group.join(' ');
}
/** @ignore */
Function `buildFilterSet` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.
async function buildFilterSet (query, model, database) {
let filterset = query.filterset || [];
if (query.filterset) {
delete query.filterset;
}
let searchgroup = {
filters: [],
link: null
};
for (let item in query) {
if (item.indexOf('.') > -1) {
searchgroup.filters.push(await prepareQuery(database, model, query, item));
} else {
searchgroup.filters.push({
key: item,
condition: 'like',
value: query[item]
});
}
if (filterset.length > 0) {
filterset[filterset.length - 1].link = 'and';
}
filterset.push(searchgroup);
}
return filterset;
}
/** @ignore */
Function `toMongooseStringQuery` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.
export default async function toMongooseStringQuery (queryBody, model, database) {
let filterset = await buildFilterSet(queryBody, model, database);
let query = [];
for (let index in filterset) {
let filtergroup = filterset[index];
if (index > 0) {
query.push(filterset[index - 1].link === 'or' ? '||' : '&&');
}
query.push(`(${await getQuery(database, model, filtergroup.filters)})`);
}
/* istanbul ignore else */
if (query.length > 0) {
query.splice(0, 0, 'var that=this;return ');
} else {
query.push('return true');
}
return query.join(' ') + ';';
}