@wisemen/scoped-filter
v1.0.4
Published
Reusable NestJS/TypeORM filter DTOs with built-in validation and query helpers.
Maintainers
Keywords
Readme
@wisemen/scoped-filter
Reusable NestJS/TypeORM filter DTOs with built-in validation and query helpers.
Installation
pnpm add @wisemen/scoped-filterPeer Dependencies
pnpm add typeorm class-validator class-transformer @nestjs/swaggerAvailable Filters
Scoped inclusion filters
Use ScopedUuidFilter or buildScopedEnumFilter(...) when the query should include or exclude a list of values.
import { ApiProperty } from '@nestjs/swagger'
import { IsScopedUuidFilter, ScopedUuidFilter } from '@wisemen/scoped-filter'
export class ListUsersQuery {
@ApiProperty({ type: ScopedUuidFilter })
@IsScopedUuidFilter()
uuid: ScopedUuidFilter<UserUuid>
}Conditional filters
Use IsFilter(...) for nested validation with the new single-value filters:
NumberFilterTimestampFilterPlainDateFilterDateTimeRangeFilterDateRangeFilter
import { ApiProperty } from '@nestjs/swagger'
import {
IsFilter,
NumberFilter,
TimestampFilter,
} from '@wisemen/scoped-filter'
export class ListInvoicesQuery {
@ApiProperty({ type: NumberFilter })
@IsFilter(NumberFilter)
amount?: NumberFilter
@ApiProperty({ type: TimestampFilter })
@IsFilter(TimestampFilter)
createdAt?: TimestampFilter
}Conditions
NumberFilterCondition:equal,notEqual,greaterThan,greaterThanOrEqual,lessThan,lessThanOrEqualDateFilterCondition:equal,notEqual,before,afterRangeFilterCondition:overlaps,doesNotOverlap,contains,doesNotContain
TypeORM
Repository helpers:
import {
Matches,
MatchesNumber,
MatchesTimestamp,
} from '@wisemen/scoped-filter'
const entities = await repo.find({
where: {
uuid: Matches(query.uuid),
amount: MatchesNumber(query.amount),
createdAt: MatchesTimestamp(query.createdAt),
},
})Query builder helpers:
import {
matches,
matchesNumber,
matchesTimestamp,
} from '@wisemen/scoped-filter'
const entities = await repo.createQueryBuilder('invoice')
.where(matches('invoice.uuid', query.uuid))
.andWhere(matchesNumber('invoice.amount', query.amount))
.andWhere(matchesTimestamp('invoice.createdAt', query.createdAt))
.getMany()License
SEE LICENSE IN LICENSE.md
