Nestjs-Keyset-Paginator
Keyset pagination library made for nestjs(mongoose) by hungreebee technologies
Changelog 3.0.5
- Added warning logs in case invalid filter data passed.
Changelog 3.0.4
- Fixed PaginationDto for "$in" operator
- Remove unusual log
- Updated Examples
Changelog 3.0.3
- Added support for nested field name in filterDto
- Done some corrections in PaginationDto
- Added OOP based approach initially
Changelog 3.0.2
- fixed crash when sort value is null
- fixed nextKeyFn crash issue
Changelog 3.0.1
- This version is backward compatible.
- Added $in and $nin mongo operator support in DTO.
Installation
Use the package manager npm to install Nestjs-Keyset-Paginator.
npm i nestjs-keyset-paginator
Usage
- In example.controller.ts, use PaginationDto to Validate params and pass it to the service.
import { PaginationDto, projectionDto } from 'nestjs-keyset-paginator'
@Controller('example')
export class ExampleController {
constructor(private readonly exampleService: ExampleService) {
}
@Get()
findAll(@Body() params: PaginationDto) {
return this.exampleService.findAll(
params.skip,
params.limit,
params?.start_key,
params?.sort?.field,
params?.sort?.order,
params?.filter,
params?.projection
)
}
}
- Then in example.service.ts, pass those params to "paginate()" along with you model (Mongoose Model).
import paginate, { filterDto, projectionDto } from 'nestjs-keyset-paginator'
@Injectable()
export class ExampleService {
constructor(
@Inject(EXAMPLE_MODEL)
private readonly exampleModel: Model<ExampleDocument>
) {
}
async findAll(
skip = 0,
limit = 10,
start_key?,
sort_field?: string,
sort_order?: number,
filter?: filterDto[],
projection?: projectionDto[]
) {
return paginate(this.exampleModel, skip, limit, start_key, sort_field, sort_order, filter, projection)
}
}
- The paginate function will return with the promise:
{ docs: docs, next_key }
Example param
Example:-
{
"filter": [
{
"name": "score",
"value": 400,
"operator": "lt"
},
{
"name": "isPassed",
"value": true,
"operator": "eq"
},
{
"name": ["outer_field_name", "inner_field_name"],
"value": "user one",
"operator": "eq"
},
{
"name": "time",
"arr_value": [40, 60],
"operator": "in"
},
{
"name": "left_count",
"arr_value": [0, 1],
"operator": "nin"
}
],
"sort": {
"field": "score",
"order": 1
},
"projection": [
{
"name": "password",
"mode": 0
}
],
"limit": 4
}
- As response, you will also get "next_key".
Example:
{
"next_key": [
{
"key": "_id",
"value": "61a4c444f9534392c70afaf6"
},
{
"key": "score",
"value": 100
}
]
}
- To get the next page, use this "next_key" object as "start_key" in the next request.
Example:
{
"filter": [
{
"name": "score",
"value": 400,
"operator": "lt"
},
{
"name": "isPassed",
"value": true,
"operator": "eq"
}
],
"sort": {
"field": "score",
"order": 1
},
"limit": 4,
"start_key": [
{
"key": "_id",
"value": "61a4c444f9534392c70afaf6"
},
{
"key": "score",
"value": 100
}
]
}
- If you provide "start_key", this will skip previous documents.
Contributing
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate (if applicable).
License
MIT