1.0.10 • Published 3 years ago

records-pagination v1.0.10

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

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

The Page class accepts three parameters

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
}
1.0.9

3 years ago

1.0.10

3 years ago

1.0.8

3 years ago

1.0.7

3 years ago

1.0.6

3 years ago

1.0.5

3 years ago

1.0.4

3 years ago

1.0.3

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago

1.0.0

3 years ago