// src/controllers/categoriesController.ts

// ...

	index: async (req: Request, res: Response) => {
		const { page, perPage } = req.query

    const perPageNumber = typeof perPage === 'string' && parseInt(perPage, 10) > 0
      ? parseInt(perPage, 10)
      : 10

    const pageNumber = typeof page === 'string' && parseInt(page, 10) > 0
      ? parseInt(page, 10)
      : 1

		const offset = (pageNumber - 1) * perPageNumber

    try {

// ...
// src/controllers/categoriesController.ts

// ...

		try {
      const { count, rows } = await Category.findAndCountAll({
	      attributes: ['id', 'name', 'position'],
	      order: [['position', 'ASC']],
	      limit: perPage,
	      offset
	    })

      return res.json({
        categories: rows,
        page: pageNumber,
        perPage: limit,
        total: count
      })
    } catch (err) {

// ...
// src/services/categoryService.ts

import { Category } from '../models'

export const categoryService = {
  findAllPaginated: async (page: number, perPage: number) => {
    const offset = (page - 1) * perPage

    const { count, rows } = await Category.findAndCountAll({
      attributes: ['id', 'name', 'position'],
      order: [['position', 'ASC']],
      limit: perPage,
      offset
    })

    return {
      categories: rows,
      page,
      perPage,
      total: count
    }
  }
}
// src/helpers/getPaginationParams.ts

export function getPaginationParams(query: any): [page: number, perPage: number] {
  const { page, perPage } = query

  const perPageNumber = typeof perPage === 'string' && parseInt(perPage, 10) > 0
    ? parseInt(perPage, 10)
    : 10

  const pageNumber = typeof page === 'string' && parseInt(page, 10) > 0
    ? parseInt(page, 10)
    : 1

  return [pageNumber, perPageNumber]
}
// src/controllers/categories-controller.ts

import { Request, Response } from 'express'
import { getPaginationParams } from '../helpers/getPaginationParams'
import { categoryService } from '../services/categoryService'

const categoriesController = {
  index: async (req: Request, res: Response) => {
    const [page, perPage] = getPaginationParams(req.query)

    try {
      const paginatedCategories = await categoryService.findAllPaginated(page, perPage)

      return res.json(paginatedCategories)
    } catch (err) {
      if (err instanceof Error) {
        return res.status(400).json({ message: err.message })
      }
    }
  }
}

export { categoriesController }