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

View File

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