const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; const buildFilter = require('vn-loopback/util/filter').buildFilter; const mergeFilters = require('vn-loopback/util/filter').mergeFilters; module.exports = Self => { Self.remoteMethodCtx('getSerial', { description: 'Return invoiceIn serial', accessType: 'READ', accepts: [{ arg: 'filter', type: 'object' }, { arg: 'daysAgo', type: 'number', required: true }, { arg: 'serial', type: 'string' }], returns: { type: 'object', root: true }, http: { path: '/getSerial', verb: 'GET' } }); Self.getSerial = async(ctx, options) => { const conn = Self.dataSource.connector; const args = ctx.args; const myOptions = {}; if (typeof options == 'object') Object.assign(myOptions, options); const issued = Date.vnNew(); const where = buildFilter(args, (param, value) => { switch (param) { case 'daysAgo': issued.setDate(issued.getDate() - value); return {'i.issued': {gte: issued}}; case 'serial': return {'i.serial': {like: `%${value}%`}}; } }); filter = mergeFilters(args.filter, {where}); const stmt = new ParameterizedSQL( `SELECT i.serial, SUM(IF(i.isBooked, 0,1)) pending, COUNT(*) total FROM vn.invoiceIn i` ); stmt.merge(conn.makeWhere(filter.where)); stmt.merge(`GROUP BY i.serial`); stmt.merge(conn.makeOrderBy(filter.order)); stmt.merge(conn.makeLimit(filter)); const result = await conn.executeStmt(stmt, myOptions); return result; }; };