dw-nest-sequelize-pagination
v1.0.3
Published
NestJS module to handle pagination with sequelize
Downloads
4
Readme
dw-nest-sequelize-pagination
A pagination module for NestJS and Sequelize
🌐 Description
NestJS module to handle pagination with sequelize
📦 Integration
With our old friend npm
npm install -save dw-nest-sequelize-pagination
With yarn
yarn add dw-nest-sequelize-pagination
▶️ Getting started
First of all inject the module to your AppModule
import { Module } from '@nestjs/common';
import { PaginateModule } from 'nestjs-sequelize-paginate';
@Module({
imports: [
PaginateModule.forRoot({
limit: 50
}),
],
})
export class AppModule {}
The forRoot() method allow you to overide default configuration
| Name | Description | Type | Default |
| ------------- | ------------------------------------------------- | ------------------------- | ---------- |
| limit | If you want to change default limit value | number | 30
|
| offset | If you want to change default offset value | number | 0
|
Service
Sequelize service override findAll
method from Sequelize and allow you to handle pagination automaticaly.
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/sequelize';
import { Includeable } from 'sequelize/types';
import { PaginationService } from 'dw-nest-sequelize-pagination';
import {
PaginationQuery,
PaginationResponse,
} from 'src/pagination/pagination.entity';
import { Vehicle } from './vehicle.entity';
@Injectable()
export class VehiclesService {
constructor(
private paginationService: PaginationService,
) {}
findAll(
paginationOptions: PaginationQuery,
include: Includeable | Includeable[] = [],
): Promise<PaginationResponse<Vehicle>> {
return this.paginationService.findAll(
{
...paginationOptions,
model: Vehicle,
},
{
include,
},
);
}
}
Let's have a look to the controller part.
import { Controller, Get } from '@nestjs/common';
import { ApiOperation } from '@nestjs/swagger';
import {
PaginationQuery,
PaginationResponse,
} from 'src/pagination/pagination.entity';
import { Pagination } from 'src/pagination/pagination.decorator';
import { Section } from 'src/sections/sections.entity';
import { VehicleType } from './vehicle-type.entity';
import { Vehicle } from './vehicle.entity';
import { VehiclesService } from './vehicles.service';
@Controller('vehicles')
export class VehiclesController {
constructor(private vehiclesService: VehiclesService) {}
@Get()
@ApiOperation({ summary: 'Get vehicles' })
getVehicles(
@Pagination({
limit: 50,
offset: 1
})
pagination: PaginationQuery,
): Promise<PaginationResponse<Vehicle>> {
return this.vehiclesService.findAll(pagination, [Section, VehicleType]);
}
}
Decorator
As you can see here you can overide the default pagination limit
and offset
for this specific route.
The @Pagination
decorator also handle validation of limit
and offset
thanks to ValidationPipe
feature from nestJS. By default Nestjs disable the validation from custom decorator.
Global ValidationPipe
If you have activate the ValidationPipe
globally you have to set validateCustomDecorators
to true
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
validateCustomDecorators: true,
}),
);
await app.listen(3000);
}
bootstrap();
To @Pagination
decorator
import { Controller, Get } from '@nestjs/common';
import { ApiOperation } from '@nestjs/swagger';
import {
PaginationQuery,
PaginationResponse,
} from 'src/pagination/pagination.entity';
import { Pagination } from 'src/pagination/pagination.decorator';
import { Section } from 'src/sections/sections.entity';
import { VehicleType } from './vehicle-type.entity';
import { Vehicle } from './vehicle.entity';
import { VehiclesService } from './vehicles.service';
@Controller('vehicles')
export class VehiclesController {
constructor(private vehiclesService: VehiclesService) {}
@Get()
@ApiOperation({ summary: 'Get vehicles' })
getVehicles(
@Pagination(new ValidationPipe({ validateCustomDecorators: true }), {
limit: 50,
offset: 1
})
pagination: PaginationQuery,
): Promise<PaginationResponse<Vehicle>> {
return this.vehiclesService.findAll(pagination, [Section, VehicleType]);
}
}