nestjs-paginate/src/decorator.ts

38 lines
1.3 KiB
TypeScript
Raw Normal View History

2020-06-26 21:25:03 +00:00
import { createParamDecorator, ExecutionContext } from '@nestjs/common'
import { Request } from 'express'
export interface PaginateQuery {
page?: number
limit?: number
sortBy?: [string, string][]
path: string
}
export const Paginate = createParamDecorator(
(_data: unknown, ctx: ExecutionContext): PaginateQuery => {
const request: Request = ctx.switchToHttp().getRequest()
const { query } = request
const path = request.protocol + '://' + request.get('host') + request.baseUrl + request.path
2020-06-26 22:14:35 +00:00
let sortBy: [string, string][] = []
2020-06-26 21:25:03 +00:00
if (query.sortBy) {
2020-06-26 22:14:35 +00:00
const params = !Array.isArray(query.sortBy) ? [query.sortBy] : query.sortBy
if (params.some((param) => typeof param === 'string')) {
for (const param of params as string[]) {
const items = param.split(':')
if (items.length === 2) {
sortBy.push([items[0], items[1]])
}
2020-06-26 21:25:03 +00:00
}
}
}
return {
page: query.page ? parseInt(query.page.toString(), 10) : undefined,
limit: query.limit ? parseInt(query.limit.toString(), 10) : undefined,
2020-06-26 22:14:35 +00:00
sortBy: sortBy.length > 0 ? sortBy : undefined,
2020-06-26 21:25:03 +00:00
path,
}
}
)