#6694 - Improve filter method #1947

Merged
jsegarra merged 5 commits from 6694_postcode_location_filter into dev 2024-01-25 07:10:58 +00:00
2 changed files with 39 additions and 28 deletions

View File

@ -1,16 +1,11 @@
const {ParameterizedSQL} = require('loopback-connector');
const {buildFilter, mergeFilters} = require('vn-loopback/util/filter');
// const {models} = require('vn-loopback/server/server');
const {buildFilter} = require('vn-loopback/util/filter');
module.exports = Self => {
Self.remoteMethod('filter', {
description:
'Find all postcodes of the model matched by postcode, town, province or country.',
accessType: 'READ',
returns: {
type: ['object'],
root: true,
},
accepts: [
{
arg: 'filter',
@ -25,6 +20,10 @@ module.exports = Self => {
http: {source: 'query'}
},
],
returns: {
type: ['object'],
root: true,
},
http: {
path: `/filter`,
verb: 'GET',
@ -32,15 +31,17 @@ module.exports = Self => {
});
Self.filter = async(ctx, filter, options) => {
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
filter = ctx?.filter ?? {};
const conn = Self.dataSource.connector;
const where = buildFilter(ctx.args, (param, value) => {
const where = buildFilter(filter?.where, (param, value) => {
switch (param) {
case 'search':
return {or: [
return {
or: [
{'pc.code': {like: `%${value}%`}},
{'t.name': {like: `%${value}%`}},
{'p.name': {like: `%${value}%`}},
@ -49,13 +50,15 @@ module.exports = Self => {
};
}
}) ?? {};
filter = mergeFilters(ctx.args?.filter ?? {}, {where});
delete ctx.filter.where;
const stmts = [];
let stmt;
stmt = new ParameterizedSQL(`
SELECT
pc.townFk,
t.provinceFk,
p.countryFk,
pc.code,
t.name as town,
p.name as province,
@ -67,7 +70,7 @@ module.exports = Self => {
JOIN country c on c.id = p.countryFk
`);
stmt.merge(conn.makeSuffix(filter));
stmt.merge(conn.makeSuffix({where, ...ctx}));
const itemsIndex = stmts.push(stmt) - 1;
const sql = ParameterizedSQL.join(stmts, ';');

View File

@ -7,13 +7,13 @@ describe('Postcode filter()', () => {
try {
const ctx = {
args: {
filter: {
},
limit: 1
};
const results = await models.Postcode.filter(ctx, options);
expect(results.length).toBeGreaterThan(0);
expect(results.length).toEqual(1);
await tx.rollback();
} catch (e) {
await tx.rollback();
@ -27,8 +27,10 @@ describe('Postcode filter()', () => {
try {
const ctx = {
args: {
filter: {
where: {
search: 46,
}
},
};
const results = await models.Postcode.filter(ctx, options);
@ -47,8 +49,10 @@ describe('Postcode filter()', () => {
try {
const ctx = {
args: {
filter: {
where: {
search: 'Alz',
}
},
};
const results = await models.Postcode.filter(ctx, options);
@ -67,8 +71,10 @@ describe('Postcode filter()', () => {
try {
const ctx = {
args: {
filter: {
where: {
search: 'one',
}
},
};
const results = await models.Postcode.filter(ctx, options);
@ -87,8 +93,10 @@ describe('Postcode filter()', () => {
try {
const ctx = {
args: {
filter: {
where: {
search: 'Ec',
}
},
};
const results = await models.Postcode.filter(ctx, options);