https://github.com/gaetansenn/dw-nest-sequelize-pagination
A pagination module for NestJS and Sequelize
https://github.com/gaetansenn/dw-nest-sequelize-pagination
Last synced: 6 months ago
JSON representation
A pagination module for NestJS and Sequelize
- Host: GitHub
- URL: https://github.com/gaetansenn/dw-nest-sequelize-pagination
- Owner: gaetansenn
- License: mit
- Created: 2021-08-07T10:58:17.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2023-12-15T05:42:16.000Z (almost 2 years ago)
- Last Synced: 2025-02-14T09:51:06.216Z (8 months ago)
- Language: TypeScript
- Size: 72.3 KB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
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`
```ts
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.
```ts
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> {
return this.paginationService.findAll(
{
...paginationOptions,
model: Vehicle,
},
{
include,
},
);
}
}
```Let's have a look to the controller part.
```ts
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> {
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`
```ts
async function bootstrap() {
const app = await NestFactory.create(AppModule);app.useGlobalPipes(
new ValidationPipe({
validateCustomDecorators: true,
}),
);await app.listen(3000);
}
bootstrap();
```#### To `@Pagination` decorator
```ts
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> {
return this.vehiclesService.findAll(pagination, [Section, VehicleType]);
}
}
```