mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-08 03:20:12 +08:00
feat: add order to pagination
This commit is contained in:
1 parent
68db16419d
commit
fa36b63fbe
8 files changed
+85
-50
No files matched your search
@@ -3,40 +3,60 @@
|
||||
// eslint-disable-next-line max-classes-per-file
|
||||
import mongoose from 'mongoose'
|
||||
|
||||
class Pagination {
|
||||
export const DESC = 'desc'
|
||||
export const ASC = 'asc'
|
||||
|
||||
class Asc {
|
||||
getOperator() {
|
||||
return '$gt'
|
||||
}
|
||||
|
||||
getOrder() {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
class Desc {
|
||||
getOperator() {
|
||||
return '$lt'
|
||||
}
|
||||
|
||||
getOrder() {
|
||||
return -1
|
||||
}
|
||||
}
|
||||
|
||||
export default class Pagination {
|
||||
nextKey = null
|
||||
itemsPerPage = 50
|
||||
order = null
|
||||
|
||||
constructor(itemsPerPage = 50, nextKey = null) {
|
||||
constructor(order, itemsPerPage = 50, nextKey = null) {
|
||||
this.itemsPerPage = itemsPerPage
|
||||
if (!order || order === DESC) {
|
||||
this.order = new Desc()
|
||||
} else if (order === ASC) {
|
||||
this.order = new Asc()
|
||||
} else {
|
||||
throw new Error('order must be asc or desc')
|
||||
}
|
||||
if (nextKey) {
|
||||
this.nextKey = new mongoose.Types.ObjectId(nextKey)
|
||||
}
|
||||
}
|
||||
|
||||
match(field) {
|
||||
const stage = this.nextKey
|
||||
? { [field]: { [this.order.getOperator()]: this.nextKey } }
|
||||
: {}
|
||||
return { $match: stage }
|
||||
}
|
||||
|
||||
sort(field) {
|
||||
return { $sort: { [field]: this.order.getOrder() } }
|
||||
}
|
||||
|
||||
limit() {
|
||||
return { $limit: this.itemsPerPage }
|
||||
}
|
||||
}
|
||||
|
||||
export class Asc extends Pagination {
|
||||
matchStage(field) {
|
||||
const stage = this.nextKey ? { [field]: { $gt: this.nextKey } } : {}
|
||||
return { $match: stage }
|
||||
}
|
||||
|
||||
order(field) {
|
||||
return { $sort: { [field]: 1 } }
|
||||
}
|
||||
}
|
||||
|
||||
export class Desc extends Pagination {
|
||||
matchStage(field) {
|
||||
const stage = this.nextKey ? { [field]: { $lt: this.nextKey } } : {}
|
||||
return { $match: stage }
|
||||
}
|
||||
|
||||
order(field) {
|
||||
return { $sort: { [field]: -1 } }
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user