Files
internship_node/day2/services/PaginationService.js
T
2025-07-11 18:05:50 +01:00

83 lines
1.5 KiB
JavaScript

const { Op } = require("sequelize");
class PaginationService {
/**
* Handle offset-based pagination with sorting
*/
static async paginateWithSort(model, options = {}) {
const {
page = 1,
limit = 10,
sort = "id",
direction = "ASC",
where = {},
} = options;
const offset = (page - 1) * limit;
const order = [[sort, direction.toUpperCase()]];
const { count, rows } = await model.findAndCountAll({
where,
order,
limit: parseInt(limit),
offset: parseInt(offset),
});
const totalPages = Math.ceil(count / limit);
return {
total: count,
page: parseInt(page),
totalPages,
list: rows,
};
}
/**
* Handle cursor-based pagination
*/
static async paginateWithCursor(model, options = {}) {
const {
id,
limit = 10,
sort = "id",
direction = "ASC",
where = {},
} = options;
const order = [[sort, direction.toUpperCase()]];
const cursorWhere = {
...where,
[sort]: {
[direction.toUpperCase() === "ASC" ? Op.gt : Op.lt]: id,
},
};
const rows = await model.findAll({
where: cursorWhere,
order,
limit: parseInt(limit),
});
return {
id: parseInt(id),
list: rows,
};
}
/**
* Get odd order IDs
*/
static async getOddOrders(model) {
return await model.findAll({
where: {
id: {
[Op.mod]: [2, 1], // id % 2 = 1 (odd numbers)
},
},
});
}
}
module.exports = PaginationService;