DEV Community

Cover image for πŸš€ Best NestJS Package for Filtering and Pagination

πŸš€ Best NestJS Package for Filtering and Pagination

First lets install this incredible package

Installation

npm install nestjs-paginate
Enter fullscreen mode Exit fullscreen mode

Now our Endpoint should look something like that

http://localhost:3000/cats?limit=5&page=2&sortBy=color:DESC&search=i&filter.age=$gte:3&select=id,name,color,age
Enter fullscreen mode Exit fullscreen mode

And the result should look like that

{
  "data": [
    {
      "id": 4,
      "name": "George",
      "color": "white",
      "age": 3
    },
    {
      "id": 5,
      "name": "Leche",
      "color": "white",
      "age": 6
    },
    {
      "id": 2,
      "name": "Garfield",
      "color": "ginger",
      "age": 4
    },
    {
      "id": 1,
      "name": "Milo",
      "color": "brown",
      "age": 5
    },
    {
      "id": 3,
      "name": "Kitty",
      "color": "black",
      "age": 3
    }
  ],
  "meta": {
    "itemsPerPage": 5,
    "totalItems": 12,
    "currentPage": 2,
    "totalPages": 3,
    "sortBy": [["color", "DESC"]],
    "search": "i",
    "filter": {
      "age": "$gte:3"
    }
  },
  "links": {
    "first": "http://localhost:3000/cats?limit=5&page=1&sortBy=color:DESC&search=i&filter.age=$gte:3",
    "previous": "http://localhost:3000/cats?limit=5&page=1&sortBy=color:DESC&search=i&filter.age=$gte:3",
    "current": "http://localhost:3000/cats?limit=5&page=2&sortBy=color:DESC&search=i&filter.age=$gte:3",
    "next": "http://localhost:3000/cats?limit=5&page=3&sortBy=color:DESC&search=i&filter.age=$gte:3",
    "last": "http://localhost:3000/cats?limit=5&page=3&sortBy=color:DESC&search=i&filter.age=$gte:3"
  }
}
Enter fullscreen mode Exit fullscreen mode

Now lets find how to set up our code

The Entity

import { Column, Entity } from 'typeorm';

@Entity()
export class CommodityEntity extends AbstractSharedEntity {
  @Column({ length: 500 })
  name: string;

  @Column({ length: 50 })
  icon: string;
}



Enter fullscreen mode Exit fullscreen mode

The Controller

...
import { Paginate, PaginateQuery } from 'nestjs-paginate';
...


  async findAll(@Query() where: any, @Paginate() query: PaginateQuery) {
    return await this.commodityService.findAll(query);
  }

...
Enter fullscreen mode Exit fullscreen mode

The Service

...
import { FilterOperator, FilterSuffix, PaginateQuery, paginate } from 'nestjs-paginate';
...


  public async findAll(query: PaginateQuery): Promise<any> {
    return paginate(query, this.commodityRepository.getRepository(), {
      sortableColumns: ['id', 'created_at'],
      nullSort: 'last',
      withDeleted: !!query?.filter?.deleted_at,
      searchableColumns: ['name'],
      select: ['name', 'icon', 'created_at', 'isActive', 'deleted_at'],
      filterableColumns: {
        name: [FilterOperator.CONTAINS, FilterOperator.EQ],
        isActive: [FilterOperator.EQ],
        deleted_at: [FilterSuffix.NOT, FilterOperator.NULL],
      },
    });
  }


...

Enter fullscreen mode Exit fullscreen mode

Top comments (0)