1.0.8 • Published 4 years ago

pagination-apis v1.0.8

Weekly downloads
357
License
ISC
Repository
github
Last release
4 years ago

Pagination-api

You only need to pass the data and the total query

Install

npm i pagination-apis

import

import * as buildPaginator from 'pagination-apis';

// or
const buildPaginator = require('pagination-apis');

build paginator

All parameters are optional.

PaginationParams {
  page?: number|string;
  limit?: number|string;
  maximumLimit?: number|string;
  url?: string;
}
  • If page is empty or invalid by default page is 1.
  • If limit is empty or invalid by default page is 50. The limit is always less than maximumLimit.
  • maximumLimit by default is 50. always try to pass a safe value and avoid making a big query.
  • url If pass url it shows the next and previous properties.
import * as buildPaginator from 'pagination-apis';

const { limit, page } = buildPaginator();

console.log(limit) // 50
console.log(page) // 1

// example 2
const { limit, page } = buildPaginator({ page: 2, limit: 30, maximumLimit: 100 });

console.log(limit) // 30
console.log(page) // 2

// example url without params
const { paginate } = buildPaginator({ url: '/api/example' });

console.log(paginate([], 150));
/*
{ 
  totalPages: 2,
  total: 100,
  data: [],
  next: '/api/example?limit=50&page=2',
  previous: '/api/example?limit=50&page=1',
}
*/

// example url with params
const { paginate } = buildPaginator({ url: '/api/example?id=30' });

console.log(paginate([], 150));
/*
{ 
  totalPages: 2,
  total: 100,
  data: [],
  next: '/api/example?id=30&limit=50&page=2',
  previous: '/api/example?id=30&limit=50&page=1',
}
*/

const { paginate } = buildPaginator({ url: '/api/example?id=30&q=hola' });

console.log(paginate([], 150));
/*
{ 
  totalPages: 2,
  total: 100,
  data: [],
  next: '/api/example?id=30&q=hola&limit=50&page=2',
  previous: '/api/example?id=30&q=hola&limit=50&page=1',
}
*/

Example with typeorm

import * as buildPaginator from 'pagination-apis';

const { skip, limit, paginate } = buildPaginator({page: 1, limit: 10});

// query builder
const [data, total] = await getRepository(User)
  .createQueryBuilder('user')
  .where('user.name = :id', { id: 1 })
  .skip(skip)
  .take(limit)
  .getManyAndCount();

// or find
const [data, total] = await userRepository.findAndCount({ 
  order: { columnName: 'ASC' }, 
  skip,
  take: limit, 
});

return paginate(data, total, '/api/example');

Example with sequelize

const { page, limit, skip, paginate } = buildPaginator({limit: 10, page: 1});

const {count, rows} = await model.findAndCountAll({
  limit,
  offset: skip,
  where: {userId},
});

return paginate(rows, count);

Example output

{ 
  totalPages: 4,
  total: 40,
  data: [
    { id: 1, name: 'example' },
    { id: 1, name: 'example' },
    { id: 1, name: 'example' },
    { id: 1, name: 'example' },
    { id: 1, name: 'example' },
    { id: 1, name: 'example' },
    { id: 1, name: 'example' },
    { id: 1, name: 'example' },
    { id: 1, name: 'example' },
    { id: 1, name: 'example' },
  ],
  next: '/api/example?limit=10&page=3',
  previous: '/api/example?limit=10&page=1',
}

Example with sequelize and typescript in base service

export interface FilterWithPagination {
  data: Array<any>;
  total: number;
  totalPages: number;
  next?: string;
  previous?: string;
}
const MAXIMUM_LIMIT_BY_PAGE = 50;

class BaseService {
  /**
   * @param {WhereOptions} whereOption
   * @returns {Promise<FilterWithPagination>}
   */
  async filterWithPagination(
    whereOptions: WhereOptions,
    params: PaginationParams,
    relations: any = [],
  ): Promise<FilterWithPagination> {
    const {
      limit, skip, paginate,
    } = buildPaginator({...params, maximumLimit: MAXIMUM_LIMIT_BY_PAGE});

    const {count, rows} = await this.model.findAndCountAll({
      limit,
      offset: skip,
      where: whereOptions,
      include: relations,
    });

    return paginate(rows, count);
  }
}
1.0.8

4 years ago

1.0.7

4 years ago

1.0.6

4 years ago

1.1.8

4 years ago

1.1.7

4 years ago

1.1.6

4 years ago

1.1.5

4 years ago

1.0.5

5 years ago

1.0.4

5 years ago

1.0.3

5 years ago

1.0.2

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago