83 lines
1.5 KiB
JavaScript
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;
|