2017-04-15 12:24:58 +00:00
'use strict' ;
2017-04-23 19:24:31 +00:00
const db = require ( './db' ) ;
const tools = require ( './tools' ) ;
2017-04-15 12:24:58 +00:00
2017-04-20 23:42:01 +00:00
module . exports . list = ( source , fields , orderBy , queryData , start , limit , callback ) => {
2017-04-15 12:24:58 +00:00
db . getConnection ( ( err , connection ) => {
if ( err ) {
return callback ( err ) ;
}
2017-04-17 20:30:31 +00:00
let limitQuery = '' ;
let limitValues = [ ] ;
if ( limit ) {
limitQuery = ' LIMIT ?' ;
limitValues . push ( limit ) ;
if ( start ) {
limitQuery += ' OFFSET ?' ;
limitValues . push ( start ) ;
}
}
2017-04-20 23:42:01 +00:00
let whereClause = '' ;
let whereValues = [ ] ;
if ( queryData ) {
whereClause = ' WHERE ' + queryData . where ;
whereValues = queryData . values ;
}
connection . query ( 'SELECT SQL_CALC_FOUND_ROWS ' + fields . join ( ', ' ) + ' FROM ' + source + whereClause + ' ORDER BY ' + orderBy + ' DESC' + limitQuery , whereValues . concat ( limitValues ) , ( err , rows ) => {
2017-04-15 12:24:58 +00:00
if ( err ) {
connection . release ( ) ;
return callback ( err ) ;
}
connection . query ( 'SELECT FOUND_ROWS() AS total' , ( err , total ) => {
connection . release ( ) ;
if ( err ) {
return callback ( err ) ;
}
return callback ( null , rows , total && total [ 0 ] && total [ 0 ] . total ) ;
} ) ;
} ) ;
} ) ;
} ;
2017-04-16 07:22:32 +00:00
module . exports . quicklist = ( source , fields , orderBy , callback ) => {
db . getConnection ( ( err , connection ) => {
if ( err ) {
return callback ( err ) ;
}
2017-04-15 12:24:58 +00:00
2017-04-16 07:22:32 +00:00
connection . query ( 'SELECT ' + fields . join ( ', ' ) + ' FROM ' + source + ' ORDER BY ' + orderBy + ' LIMIT 1000' , ( err , rows ) => {
connection . release ( ) ;
if ( err ) {
return callback ( err ) ;
}
return callback ( null , ( rows || [ ] ) . map ( tools . convertKeys ) ) ;
} ) ;
} ) ;
} ;
module . exports . filter = ( source , fields , request , columns , searchFields , defaultOrdering , queryData , callback ) => {
2017-04-15 12:24:58 +00:00
db . getConnection ( ( err , connection ) => {
if ( err ) {
return callback ( err ) ;
}
let query = 'SELECT COUNT(*) AS total FROM ' + source ;
let values = [ ] ;
if ( queryData ) {
query += ' WHERE ' + queryData . where ;
values = values . concat ( queryData . values || [ ] ) ;
}
connection . query ( query , values , ( err , total ) => {
if ( err ) {
connection . release ( ) ;
return callback ( err ) ;
}
total = total && total [ 0 ] && total [ 0 ] . total || 0 ;
let ordering = [ ] ;
if ( request . order && request . order . length ) {
request . order . forEach ( order => {
let orderField = columns [ Number ( order . column ) ] ;
let orderDirection = ( order . dir || '' ) . toString ( ) . toLowerCase ( ) === 'desc' ? 'DESC' : 'ASC' ;
if ( orderField ) {
2017-04-16 07:22:32 +00:00
ordering . push ( orderField + ' ' + orderDirection ) ;
2017-04-15 12:24:58 +00:00
}
} ) ;
}
if ( ! ordering . length ) {
ordering . push ( defaultOrdering ) ;
}
let searchWhere = '' ;
let searchArgs = [ ] ;
if ( request . search && request . search . value ) {
let searchVal = '%' + request . search . value . replace ( /\\/g , '\\\\' ) . replace ( /([%_])/g , '\\$1' ) + '%' ;
searchWhere = searchFields . map ( field => field + ' LIKE ?' ) . join ( ' OR ' ) ;
2017-04-23 19:24:31 +00:00
searchArgs = searchFields . map ( ( ) => searchVal ) ;
2017-04-15 12:24:58 +00:00
}
2017-04-16 07:22:32 +00:00
let query = 'SELECT SQL_CALC_FOUND_ROWS ' + fields . join ( ', ' ) + ' FROM ' + source + ' WHERE ' + ( searchWhere ? '(' + searchWhere + ')' : '1' ) + ( queryData ? ' AND (' + queryData . where + ')' : '' ) + ' ORDER BY ' + ordering . join ( ', ' ) + ' LIMIT ? OFFSET ?' ;
2017-04-15 12:24:58 +00:00
let args = searchArgs . concat ( queryData ? queryData . values : [ ] ) . concat ( [ Number ( request . length ) || 50 , Number ( request . start ) || 0 ] ) ;
connection . query ( query , args , ( err , rows ) => {
if ( err ) {
connection . release ( ) ;
return callback ( err ) ;
}
connection . query ( 'SELECT FOUND_ROWS() AS total' , ( err , filteredTotal ) => {
connection . release ( ) ;
if ( err ) {
return callback ( err ) ;
}
rows = rows . map ( row => tools . convertKeys ( row ) ) ;
filteredTotal = filteredTotal && filteredTotal [ 0 ] && filteredTotal [ 0 ] . total || 0 ;
return callback ( null , rows , total , filteredTotal ) ;
} ) ;
} ) ;
} ) ;
} ) ;
} ;