A pagination module for NestJS and Sequelize, inspired by dw-nest-sequelize-pagination with deeper customization
$ npm install @ntheanh201/nestjs-sequelize-pagination
$ yarn add @ntheanh201/nestjs-sequelize-pagination
Import and add StripeModule to the imports section of the consuming module (most likely AppModule).
import { PaginationModule } from '@ntheanh201/nestjs-sequelize-pagination';
@Module({
imports: [PaginationModule.forRoot({ isGlobal: true })],
})
export class AppModule {}
This module support forRoot patterns for configuration, with values:
Name | Description | Type | Default |
---|---|---|---|
isGlobal | Use module globally | boolean | true |
limit | The number of rows returned | number | 10 |
page | The page to start pagination, one-based indexing | number | 1 |
orderBy | The key sorting returned data | string | null |
orderDirection | The sorting direction (ASC, DESC, NULLS FIRST, ...) | string | null |
Sequelize service override findAll method from Sequelize and allow you to handle pagination automaticaly.
import { Injectable } from '@nestjs/common';
import { Includeable, Op } from 'sequelize';
import {
PaginationQuery,
PaginationResponse,
PaginationService,
} from '@ntheanh201/nestjs-sequelize-pagination';
@Injectable()
export class ProductService {
constructor(private paginationService: PaginationService) {}
findAll(
paginationOptions: PaginationQuery,
include: Includeable | Includeable[] = [],
): Promise<PaginationResponse<Product>> {
let whereCondition;
const keySearch = paginationOptions?.searchKey;
if (keySearch) {
whereCondition = {
[Op.or]: [
{ sku: { [Op.like]: `%${keySearch}%` } },
{ barcode: { [Op.like]: `%${keySearch}%` } },
{ name: { [Op.like]: `%${keySearch}%` } },
],
};
}
return this.paginationService.findAll(
{
...paginationOptions,
model: Product,
},
{
where: whereCondition,
include,
},
);
}
}
@Controller('/products')
export class ProductController {
constructor(private readonly productService: ProductService) {}
@Get()
@ApiOperation({ summary: 'Get products' })
getProducts(
@Pagination({
limit: 10,
page: 0,
orderBy: 'createdAt',
orderDirection: 'DESC',
searchKey: 'pro',
})
pagination: PaginationQuery,
): Promise<PaginationResponse<Product>> {
return this.productService.findAll(pagination);
}
}
Contributions welcome! See Contributing.
The Anh Nguyen (Facebook)