Skip to content
This repository has been archived by the owner on Apr 2, 2020. It is now read-only.
/ nestjs-pagination Public archive

A simple NestJS interceptor adding Link and Content-Range headers

Notifications You must be signed in to change notification settings

algoan/nestjs-pagination

Repository files navigation

Nest Logo

A Nest interceptor to display the Link and the Content Range in the response headers.

NestJS Request Pagination

DEPRECATED: This repository is now part of the Algoan NestJS Lerna package. It won't be maintained anymore.

A simple NestJS interceptor catching query parameters and format a Link Header, based on GitHub pagination API. This module uses format-link-header node module to build the response Link Header.

Installation

npm install --save @algoan/nestjs-pagination

Requirements

  • On this version, the API attached with this interceptor needs to return an object:
{
  "totalDocs": 1530,
  "resource": [ { ... }, ..., { ... }]
}
  • The resource has to be specified in the interceptor constructor

Limits

  • This module does not take into account what is returned in the resource property. It may be inconsistent with headers set by the interceptor.

Quick Start

Import LinkHeaderInterceptor next to a controller method.

import { LinkHeaderInterceptor } from '@algoan/nestjs-pagination';
import { Controller, Get, UseInterceptors } from '@nestjs/common';

@Controller()
/**
 * Controller returning a lot of documents
 */
class AppController {
  /**
   * Find all documents
   */
  @UseInterceptors(new LinkHeaderInterceptor({ resource: 'data' }))
  @Get('/data')
  public async findAll(): Promise<{ totalDocs: number; resource: DataToReturn[] }> {
    const data: DataToReturn = await model.find(...);
    const count: number = await model.count();

    return { totalDocs: count, resource: data };
  }
}

For instance, if you have 1015 resources, calling GET /data?page=4&per_page=100 will return:

Content-Range: data 300-399/1015
Link: </data?page=1&per_page=100>; rel="first", </data?page=11&per_page=100>; rel="last", </data?page=5&per_page=100>; rel="next", </data?page=3&per_page=100>; rel="prev"

If you use MongoDB as your database, we also provide a ParamDecorator you can use to convert the request to a mongo query parameter.

import { LinkHeaderInterceptor, MongoPaginationParamDecorator, MongoPagination } from '@algoan/nestjs-pagination';
import { Controller, Get, UseInterceptors } from '@nestjs/common';

@Controller()
/**
 * Controller returning a lot of documents
 */
class AppController {
  /**
   * Find all documents
   */
  @UseInterceptors(new LinkHeaderInterceptor({ resource: 'data' }))
  @Get('/data')
  public async findAll(@MongoPaginationParamDecorator() pagination: MongoPagination ): Promise<{ totalDocs: number; resource: DataToReturn[] }> {
    const data: DataToReturn = await model.find(pagination);
    const count: number = await model.count(pagination.filter);

    return { totalDocs: count, resource: data };
  }
}

Usage

By default, the interceptor and the decorator will look for the query parameters page and per_page. You can also change the name of those parameters if you want, by passing a configuration object. Beware that if you use both the interceptor and the decorator, you need to pass the configuration to both of them.

new LinkHeaderInterceptor({ resource: 'data', pageName: '_page', perPageName: 'numberPerPage' })

@MongoPaginationParamDecorator({ pageName: '_page', perPageName: 'numberPerPage' })