records-pagination
    TypeScript icon, indicating that this package has built-in type declarations

    1.0.10 • Public • Published

    Records Pagination

    A library based on Spring Data pagination

    Usage

    You must install the dependency using the following command:

    npm install records-pagination

    Or

    yarn add records-pagination

    With the library installed you can use the classes Pageable and Page

    The Pageable class accepts two parameters

    • page [Number]
    • limit [Number]

    The Page class accepts three parameters

    • pageable [Pageable]
    • records [T]
    • totalRecords [Number]

    If you do not enter these parameters when instantiating the class, it will look for it's default values. For page it is 1 and for limit it is 10

    An example of use using NestJS

    app.controller.ts

    import { Controller, Get, ParseIntPipe, Query } from '@nestjs/common';
    
    import { Page, Pageable } from 'records-pagination';
    
    import { AppService } from './app.service';
    import { User } from './schemas/user.schema';
    
    @Controller()
    export class AppController {
      constructor(private readonly appService: AppService) {}
    
      @Get()
      async findAll(
        @Query('page', ParseIntPipe) page: number,
        @Query('limit', ParseIntPipe) limit: number,
      ): Promise<Page<User>> {
        const pageable = new Pageable(page, limit);
        return await this.appService.findAll(pageable);
      }
    }

    In the example above I expect to receive a page and a limit always, if your application is optional don't forget to make the validations.

    app.service.ts

    import { Injectable } from '@nestjs/common';
    import { InjectModel } from '@nestjs/mongoose';
    
    import { Model } from 'mongoose';
    import { Page, Pageable } from 'records-pagination';
    
    import { User, UserDocument } from './schemas/user.schema';
    
    
    @Injectable()
    export class AppService {
      constructor(@InjectModel(User.name) private userModel: Model<UserDocument>) {}
    
      async findAll(pageable: Pageable): Promise<Page<User>> {
        const [totalRecords, records] = await Promise.all([
          this.userModel.countDocuments(),
          this.userModel
            .find()
            .skip((pageable.getPage() - 1) * pageable.getLimit())
            .limit(pageable.getLimit())
            .sort([['name', 1]]),
        ]);
    
        return new Page<User>(pageable, records, totalRecords);
      }
    }

    In our service we are consuming a collection of MongoDB users. If you have noticed the Page class, expect to receive a type. This type is used to type records

    We have a database with the following user data:

    [
      {
        "_id": "607a402d96aa69dde66716c0",
        "name": "Aline"
      },
      {
        "_id": "607a3fd896aa69dde66716ba",
        "name": "Ana"
      },
      {
        "_id": "607a3fca96aa69dde66716b9",
        "name": "André"
      },
      {
        "_id": "607a401396aa69dde66716be",
        "name": "Eduardo"
      },
      {
        "_id": "607a402396aa69dde66716bf",
        "name": "Isaac"
      },
      {
        "_id": "607a403896aa69dde66716c1",
        "name": "Maria"
      },
      {
        "_id": "607a3fe996aa69dde66716bb",
        "name": "Silvana"
      },
      {
        "_id": "607a400796aa69dde66716bd",
        "name": "Vanessa"
      },
      {
        "_id": "607a3ffb96aa69dde66716bc",
        "name": "Vilson"
      }
    ]

    Now, if you call the pagination route by passing a page with the value 2 and a limit with a value 4, we have the following return:

    {
      "records": [
        {
          "_id": "607a402396aa69dde66716bf",
          "name": "Isaac"
        },
        {
          "_id": "607a403896aa69dde66716c1",
          "name": "Maria"
        },
        {
          "_id": "607a3fe996aa69dde66716bb",
          "name": "Silvana"
        },
        {
          "_id": "607a400796aa69dde66716bd",
          "name": "Vanessa"
        }
      ],
      "totalPages": 3,
      "currentPage": 2,
      "itemsPerPage": 4,
      "totalRecords": 9
    }

    Install

    npm i records-pagination

    DownloadsWeekly Downloads

    17

    Version

    1.0.10

    License

    MIT

    Unpacked Size

    11 kB

    Total Files

    16

    Last publish

    Collaborators

    • andrewronscki