A flexible filtering system for NestJS applications. This package provides an easy way to implement complex filtering in your NestJS applications with MongoDB and PostgreSQL support.
npm install nestjs-dynamic-filter- Easy-to-use decorators for defining filterable fields
- Support for multiple filter operations (exact, contains, greater than, less than, etc.)
- Automatic Swagger documentation
- Built-in pagination support
- MongoDB/Mongoose integration
- PostgreSQL/TypeORM integration
- Type-safe filtering
- Database-agnostic query building
- Import the NestjsDynamicFilterModule in your app.module.ts:
For MongoDB:
import { NestjsDynamicFilterModule } from 'nestjs-dynamic-filter';
@Module({
imports: [
NestjsDynamicFilterModule.forRoot({
databaseType: 'mongodb', // Optional, defaults to 'mongodb'
}),
// ... other imports
],
})
export class AppModule {}For PostgreSQL:
import { NestjsDynamicFilterModule } from 'nestjs-dynamic-filter';
@Module({
imports: [
NestjsDynamicFilterModule.forRoot({
databaseType: 'postgres',
}),
// ... other imports
],
})
export class AppModule {}- Define your filter DTO:
import { FilterableField, FilterOperationType } from 'nestjs-dynamic-filter';
import { PaginationQueryDto } from 'nestjs-dynamic-filter';
export enum UserStatus {
ACTIVE = 'ACTIVE',
INACTIVE = 'INACTIVE'
}
export class UserFilterDto extends PaginationQueryDto {
@FilterableField()
name?: string;
@FilterableField({
operations: [FilterOperationType.EXACT],
enum: UserStatus
})
status?: UserStatus;
@FilterableField({
operations: [FilterOperationType.GTE, FilterOperationType.LTE]
})
age?: number;
}- Use in your controller:
For MongoDB:
import { FilterBuilderService } from 'nestjs-dynamic-filter';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
@Controller('users')
export class UserController {
constructor(
private readonly filterBuilder: FilterBuilderService,
@InjectModel('User') private readonly userModel: Model<User>,
) {}
@Get()
async findAll(@Query() query: UserFilterDto) {
const filter = this.filterBuilder.buildQuery(query);
return this.userModel.find(filter).exec();
}
}For PostgreSQL:
import { FilterBuilderService } from 'nestjs-dynamic-filter';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
@Controller('users')
export class UserController {
constructor(
private readonly filterBuilder: FilterBuilderService,
@InjectRepository(User) private readonly userRepository: Repository<User>,
) {}
@Get()
async findAll(@Query() query: UserFilterDto) {
const where = this.filterBuilder.buildQuery(query);
return this.userRepository.find({ where });
}
}exact: Exact matchicontains: Case-insensitive containsin: Value in arraygte: Greater than or equallte: Less than or equal
For a field named age, you can use:
age__exact=25age__gte=18age__lte=65
For text fields:
name__icontains=john
For MongoDB:
import { FilterService } from 'nestjs-dynamic-filter';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
@Controller('users')
export class UserController {
constructor(
private readonly filterService: FilterService,
@InjectModel('User') private readonly userModel: Model<User>,
) {}
@Get('@filters')
async getFilters() {
return this.filterService.getFilters(UserFilterDto, this.userModel);
}
}For PostgreSQL:
import { FilterService } from 'nestjs-dynamic-filter';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
@Controller('users')
export class UserController {
constructor(
private readonly filterService: FilterService,
@InjectRepository(User) private readonly userRepository: Repository<User>,
) {}
@Get('@filters')
async getFilters() {
return this.filterService.getFilters(UserFilterDto, this.userRepository);
}
}@FilterableField({
operations: [
FilterOperationType.EXACT,
FilterOperationType.ICONTAINS,
FilterOperationType.IN
]
})
field?: string;Contributions are welcome! Please feel free to submit a Pull Request.
MIT