@@ -4,6 +4,7 @@ import { SearchParams } from './baseCrud.js';
44import { Subject } from 'rxjs' ;
55import { PrismaMapperEntity , PrismaMapperEntityField , PrismaMetaMapper } from './prismaMetaMapper.js'
66import { Generics } from '@tsed/schema' ;
7+ import { SearchFilterRecord , SearchFilterValue } from './types.js' ;
78
89export interface IBaseService {
910 onUpdate : Subject < { id : number , inputData : any , result : any } >
@@ -129,7 +130,7 @@ export class BaseService<T> implements OnInit, IBaseService {
129130 RG : 'RG'
130131 } ;
131132
132- protected modeToTypeMappers = {
133+ protected modeToTypeMappers : Record < string , ( prismaFilters : any , value : any , fieldName : string , fieldInfo : any , isRelation : boolean ) => void > = {
133134 EM : ( prismaFilters : any , value : any , fieldName : string , fieldInfo : any , isRelation : boolean ) => {
134135 if ( fieldInfo . type === 'Int' && ! fieldInfo . isRequired ) {
135136 _ . set ( prismaFilters , `${ fieldName } ` , null ) ;
@@ -211,41 +212,48 @@ export class BaseService<T> implements OnInit, IBaseService {
211212 } ,
212213 }
213214
214- protected modeToFilter ( filters ?: Record < string , { mode : string ; value : any , isRelation ?: boolean } > ) {
215- return _ . transform (
216- filters ?? { } ,
217- ( finalFilters : any , filter , fieldName ) => {
218- const { mode, value, isRelation } = filter ;
219- this . modeToTypeMappers [ mode ] ( finalFilters , value , fieldName , this . currentModelFieldsMapping [ fieldName ] , isRelation ) ;
220- } ,
221- { }
222- ) ;
215+ protected modeToPrismaFilter ( filters : SearchFilterRecord ) {
216+ return _ . transform < SearchFilterValue , any > ( filters , ( finalFilters , filter , fieldName ) => {
217+ const { mode, value, isRelation } = filter ;
218+ if ( ! _ . has ( this . modeToTypeMappers , mode ) ) {
219+ throw new Error ( `Unsupported filter mode: ${ mode } ` ) ;
220+ }
221+ this . modeToTypeMappers [ mode ] ( finalFilters , value , fieldName , this . currentModelFieldsMapping [ fieldName ] , isRelation ) ;
222+ } , { } ) ;
223+ }
224+
225+ protected filtersToPrismaOrCondition ( filters : SearchFilterRecord [ ] ) {
226+ return _ . transform < SearchFilterRecord , any > ( filters , ( finalFilters , modeFilter ) => {
227+ if ( ! finalFilters . OR ) {
228+ finalFilters . OR = [ ] ;
229+ }
230+ const prismaFilter = this . modeToPrismaFilter ( modeFilter ) ;
231+ finalFilters . OR . push ( prismaFilter ) ;
232+ } , { } ) ;
223233 }
224234
225- async getAll ( { filters, offset, limit, fields, include, orderBy } : SearchParams ) {
235+ async getAll ( { filters, offset, limit, fields, orderBy } : SearchParams ) {
236+ const prismaWhere = this . filtersToPrismaOrCondition ( filters )
237+ const selectFields = _ . transform ( fields , ( result , field ) => {
238+ if ( _ . includes ( field , '.' ) ) {
239+ const [ relations , relationColumnName ] = _ . split ( field , '.' )
240+ if ( ! result [ relations ] ) {
241+ result [ relations ] = { select : { } } ;
242+ }
243+ result [ relations ] . select [ relationColumnName ] = true ;
244+ return ;
245+ }
246+ result [ field ] = true ;
247+ } , { } )
226248 const properties = {
227249 skip : offset ,
228250 take : limit ,
229- include : {
230- ...include ,
231- ..._ . transform ( _ . remove ( fields , 'id' ) , ( result , field ) => {
232- result [ field ] = true ;
233- } , { } )
234- } ,
235251 orderBy : orderBy ,
236- where : this . modeToFilter ( filters ) ,
237- select : _ . isNil ( fields )
238- ? null
239- : _ . transform ( fields , ( result , field ) => {
240- result [ field ] = true ;
241- } , { } )
252+ where : prismaWhere ,
253+ select : selectFields
242254 } ;
243- if ( _ . size ( properties . include ) ) {
244- delete properties . select ;
245- }
246-
247255 const { _count : { id : total } } = await this . injectedRepository . aggregate ( {
248- where : this . modeToFilter ( filters ) ,
256+ where : prismaWhere ,
249257 _count : {
250258 id : true ,
251259 }
0 commit comments