Adonis V5 Lucid - Conditional Query

596 Views Asked by At

In the following code I'd like to filter according to received filters. The thing is that each of the filters can be defined or not. I'm getting a error inside the Lucid If statements because filters.status and filters.departments can be undefined. Is that a bug or is there a solution that does not involves telling Typescript to ignore the error?

In theory, the Lucid if statement checks if both filter properties exists.

export interface ISalesFilter {
  status?: number[];
  departments?: string[];
 }

async filterSales(filters: ISalesFilter {
  const filteredSales = await FilterModel.query()
     .if(filters.status, (query) => {
         query.whereIn('statusId', filters.status);
      })
     .if(filters.department, (query) => {
         query.whereIn('departmentId', filters.departments); 
     });
  return filteredSales;;
}

The following solution works, but they doesn't sound like bad practice to me:

export interface ISalesFilter {
  status?: number[];
  departments?: string[];
 }

async filterSales(filters: ISalesFilter {
  const filteredSales = await FilterModel.query()
     .if(filters.status, (query) => {
         if(filters.status){
             query.whereIn('statusId', filters.status);
         }
      })
     .if(filters.department, (query) => {
         if(filters.departments){
             query.whereIn('departmentId', filters.departments); 
         }
         
     });
  return filteredSales;;
}

Telling Typescript to ignore the problem also works, but again a fell it's not a good way of solving this:

export interface ISalesFilter {
  status?: number[];
  departments?: string[];
 }

async filterSales(filters: ISalesFilter {
  const filteredSales = await FilterModel.query()
     .if(filters.status, (query) => {
         // @ts-ignore
         query.whereIn('statusId', filters.status);
         
      })
     .if(filters.department, (query) => {
         // @ts-ignore
         query.whereIn('departmentId', filters.departments);     
         
     });
  return filteredSales;;
}
0

There are 0 best solutions below