Skip to content

Commit 58f6996

Browse files
committed
Merge branch 'feature-DATAAPI-38_date-filters' into release-3.8.0
2 parents d74309c + 552e00f commit 58f6996

File tree

3 files changed

+74
-16
lines changed

3 files changed

+74
-16
lines changed

services/DataApiConfigurationService.cfc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,7 @@ component {
841841
var objectName = getEntityObject( arguments.entity );
842842
var selectFields = getSelectFields( arguments.entity );
843843
var props = $getPresideObjectService().getObjectProperties( objectName );
844-
var acceptedTypes = [ "boolean" ];
844+
var acceptedTypes = [ "boolean", "date", "datetime" ];
845845

846846
for( var propName in props ) {
847847
if ( !selectFields.find( propName ) ) {

services/DataApiService.cfc

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ component {
5151
, struct filters = {}
5252
) {
5353
var args = {
54-
maxRows = pageSize
55-
, startRow = ( ( arguments.page - 1 ) * arguments.pageSize ) + 1
56-
, orderby = "datemodified"
57-
, filter = {}
54+
maxRows = pageSize
55+
, startRow = ( ( arguments.page - 1 ) * arguments.pageSize ) + 1
56+
, orderby = "datemodified"
57+
, filter = {}
58+
, extraFilters = []
5859
};
5960
if ( args.maxRows < 1 ) {
6061
args.maxRows = 100;
@@ -63,17 +64,7 @@ component {
6364
args.startRow = 1;
6465
}
6566

66-
if ( arguments.filters.count() ) {
67-
var configService = _getConfigService();
68-
var filterFields = configService.getFilterFields( arguments.entity );
69-
70-
for( var field in filterFields ) {
71-
var propName = configService.getPropertyNameFromFieldAlias( arguments.entity, field );
72-
if ( StructKeyExists( arguments.filters, field ) || StructKeyExists( arguments.filters, propName ) ) {
73-
args.filter[ propName ] = arguments.filters[ field ] ?: arguments.filters[ propName ];
74-
}
75-
}
76-
}
67+
_prepareFilters( arguments.entity, arguments.filters, args );
7768

7869
var result = {
7970
records = _selectData( arguments.entity, args, arguments.fields )
@@ -506,6 +497,47 @@ component {
506497
return translated;
507498
}
508499

500+
private function _prepareFilters( entity, filters, args ) {
501+
if ( StructCount( arguments.filters ) ) {
502+
var configService = _getConfigService();
503+
var objectName = configService.getEntityObject( arguments.entity );
504+
var dbAdapter = $getPresideObjectService().getDbAdapterForObject( objectName );
505+
var filterFields = configService.getFilterFields( arguments.entity );
506+
507+
for( var field in filterFields ) {
508+
var propName = configService.getPropertyNameFromFieldAlias( arguments.entity, field );
509+
var fieldType = $getPresideObjectService().getObjectPropertyAttribute( objectName, propName, "dbtype" );
510+
511+
if ( StructKeyExists( arguments.filters, field ) || StructKeyExists( arguments.filters, propName ) ) {
512+
args.filter[ propName ] = arguments.filters[ field ] ?: arguments.filters[ propName ];
513+
}
514+
515+
if ( ReFindNoCase( "^date", fieldType ) ) {
516+
if ( StructKeyExists( arguments.filters, field & ".min" ) || StructKeyExists( arguments.filters, propName & ".min" ) ) {
517+
var value = arguments.filters[ field & ".min" ] ?: arguments.filters[ propName & ".min" ];
518+
ArrayAppend( args.extraFilters, {
519+
filter = "#dbAdapter.escapeEntity( '#objectName#.#propName#' )# >= :#propName#__min"
520+
, filterParams = { "#propName#__min" = {
521+
type = dbAdapter.sqlDataTypeToCfSqlDatatype( fieldType )
522+
, value = value
523+
} }
524+
} );
525+
}
526+
if ( StructKeyExists( arguments.filters, field & ".max" ) || StructKeyExists( arguments.filters, propName & ".max" ) ) {
527+
var value = arguments.filters[ field & ".max" ] ?: arguments.filters[ propName & ".max" ];
528+
ArrayAppend( args.extraFilters, {
529+
filter = "#dbAdapter.escapeEntity( '#objectName#.#propName#' )# <= :#propName#__max"
530+
, filterParams = { "#propName#__max" = {
531+
type = dbAdapter.sqlDataTypeToCfSqlDatatype( fieldType )
532+
, value = value
533+
} }
534+
} );
535+
}
536+
}
537+
}
538+
}
539+
}
540+
509541
// GETTERS AND SETTERS
510542
private any function _getPresideRestService() {
511543
return _presideRestService;

services/DataApiSpecService.cfc

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,23 @@ component {
314314
, description = _i18nNamespaced( uri="dataapi:operation.#entityName#.get.params.fields.#field#.description", defaultValue=_i18nNamespaced( uri=basei18n & "field.#field#.help", defaultValue=_i18nNamespaced( uri="dataapi:field.#field#.description", defaultValue="" ) ) )
315315
, schema = _getFieldSchema( entityName, field )
316316
} );
317+
318+
if ( _isDateField( entityName, field ) ) {
319+
params.append( {
320+
name = "filter.#field#.min"
321+
, in = "query"
322+
, required = false
323+
, description = _i18nNamespaced( uri="dataapi:operation.#entityName#.get.params.fields.#field#.description", defaultValue=_i18nNamespaced( uri=basei18n & "field.#field#.help", defaultValue=_i18nNamespaced( uri="dataapi:field.#field#.description", defaultValue="" ) ) )
324+
, schema = _getFieldSchema( entityName, field )
325+
} );
326+
params.append( {
327+
name = "filter.#field#.max"
328+
, in = "query"
329+
, required = false
330+
, description = _i18nNamespaced( uri="dataapi:operation.#entityName#.get.params.fields.#field#.description", defaultValue=_i18nNamespaced( uri=basei18n & "field.#field#.help", defaultValue=_i18nNamespaced( uri="dataapi:field.#field#.description", defaultValue="" ) ) )
331+
, schema = _getFieldSchema( entityName, field )
332+
} );
333+
}
317334
}
318335

319336
spec.paths[ "/entity/#entityName#/" ].get = {
@@ -663,6 +680,15 @@ component {
663680
return generator == "UUID";
664681
}
665682

683+
private boolean function _isDateField( required string entity, required string field ) {
684+
var configService = _getConfigService();
685+
var objectName = configService.getEntityObject( arguments.entity );
686+
var propName = configService.getPropertyNameFromFieldAlias( arguments.entity, arguments.field );
687+
var dbtype = $getPresideObjectService().getObjectPropertyAttribute( objectName, propName, "dbtype" );
688+
689+
return ReFindNoCase( "^date", dbtype );
690+
}
691+
666692
// GETTERS AND SETTERS
667693
private any function _getConfigService() {
668694
return _configService;

0 commit comments

Comments
 (0)