@@ -18,13 +18,15 @@ import {
18
18
isArrayFull ,
19
19
isNil ,
20
20
isObject ,
21
+ isObjectFull ,
21
22
isUndefined ,
22
23
objKeys ,
23
24
} from '@nestjsx/util' ;
24
25
/**
25
26
* mongoose imports
26
27
*/
27
28
import { Document , DocumentQuery , Model , Schema , Types } from 'mongoose' ;
29
+ import { MONGOOSE_OPERATOR_MAP } from 'nest-crud-mongoose/mongoose-operator-map' ;
28
30
import { DeepPartial , ObjectLiteral } from 'typeorm' ;
29
31
30
32
/**
@@ -421,23 +423,87 @@ export class MongooseCrudService<T extends Document> extends CrudService<T> {
421
423
options : CrudRequestOptions ,
422
424
parsed : ParsedRequestParams ,
423
425
) : any {
424
- const filter = this . queryFilterToSearch ( options . query . filter ) ;
425
426
const paramsFilter = this . queryFilterToSearch ( parsed . paramsFilter ) ;
426
427
427
- return { ...filter , ...paramsFilter } ;
428
+ const hasSearch = isObjectFull ( parsed . search ) ;
429
+
430
+ if ( hasSearch ) {
431
+ const search = this . queryFilterToSearch ( parsed . search ) ;
432
+ return {
433
+ ...search ,
434
+ ...paramsFilter ,
435
+ } ;
436
+ }
437
+
438
+ const filters = parsed . filter . filter (
439
+ ( condition ) => ! ! condition && isObjectFull ( condition ) ,
440
+ ) ;
441
+ const ors = parsed . or . filter ( ( condition ) => ! ! condition && isObjectFull ( condition ) ) ;
442
+ const filter = this . buildIndividualFilter ( filters ) ;
443
+ const or = this . buildIndividualFilter ( ors ) ;
444
+
445
+ if ( filters . length === 0 && ors . length === 0 ) {
446
+ return {
447
+ ...paramsFilter ,
448
+ } ;
449
+ } else if ( filters . length === 1 && ors . length === 0 ) {
450
+ return {
451
+ $and : filters ,
452
+ ...paramsFilter ,
453
+ } ;
454
+ } else if ( ors . length === 1 && filters . length === 0 ) {
455
+ return {
456
+ $or : ors ,
457
+ ...paramsFilter ,
458
+ } ;
459
+ } else if ( filters . length === 1 && ors . length === 1 ) {
460
+ return {
461
+ $or : [ ...filter , ...or ] ,
462
+ ...paramsFilter ,
463
+ } ;
464
+ } else {
465
+ return {
466
+ $or : [
467
+ {
468
+ $and : ors ,
469
+ } ,
470
+ {
471
+ $and : filters ,
472
+ } ,
473
+ ] ,
474
+ ...paramsFilter ,
475
+ } ;
476
+ }
477
+ }
478
+
479
+ private buildIndividualFilter ( filters : any [ ] ) : any [ ] {
480
+ return filters
481
+ . filter ( ( filter ) => ! ! MONGOOSE_OPERATOR_MAP [ filter . operator ] )
482
+ . map ( ( filter ) => MONGOOSE_OPERATOR_MAP [ filter . operator ] ( filter . value ) ) ;
428
483
}
429
484
430
485
private queryFilterToSearch ( filter : any ) : any {
431
486
return isArrayFull ( filter )
432
- ? filter . reduce (
433
- ( prev , item ) => ( {
434
- ...prev ,
435
- [ item . field ] : { [ item . operator ] : item . value } ,
436
- } ) ,
437
- { } ,
438
- )
439
- : isObject ( filter )
440
487
? filter
488
+ . filter ( ( item ) => ! ! MONGOOSE_OPERATOR_MAP [ item . operator ] )
489
+ . reduce (
490
+ ( prev , item ) => ( {
491
+ ...prev ,
492
+ [ item . field ] : MONGOOSE_OPERATOR_MAP [ item . operator ] ( item . value ) ,
493
+ } ) ,
494
+ { } ,
495
+ )
496
+ : isObject ( filter )
497
+ ? Object . keys ( filter ) . reduce ( ( prev , key ) => {
498
+ const conditions = isArrayFull ( filter [ key ] )
499
+ ? filter [ key ] . filter ( ( condition ) => ! ! condition && isObjectFull ( condition ) )
500
+ : [ ] ;
501
+
502
+ return {
503
+ ...prev ,
504
+ ...( conditions . length > 0 ? { [ key ] : conditions } : { } ) ,
505
+ } ;
506
+ } , { } )
441
507
: { } ;
442
508
}
443
509
0 commit comments