PaginationService.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233
  1. import { LucidModel } from '@ioc:Adonis/Lucid/Orm'
  2. export default class PaginationService {
  3. protected model: LucidModel
  4. constructor(model: LucidModel) {
  5. this.model = model
  6. }
  7. public async paginate(query: any) {
  8. let q = this.model.query()
  9. Object.keys(query).forEach((key) => {
  10. if (key === 'page' || key === 'pageSize') {
  11. return
  12. }
  13. if (this.model.$hasColumn(key)) {
  14. q.where(key, query[key])
  15. }
  16. })
  17. let orders: { column: string; order: 'asc' | 'desc' }[] = []
  18. if (query.orderBy) {
  19. query.orderBy.split(';').forEach((e) => {
  20. let [column, order] = e.split(',')
  21. if (this.model.$hasColumn(column)) {
  22. orders.push({ column, order: order || 'asc' })
  23. }
  24. })
  25. }
  26. if (orders.length === 0 && this.model.$hasColumn('createdAt')) {
  27. orders.push({ column: 'createdAt', order: 'desc' })
  28. }
  29. q.orderBy(orders)
  30. return await q.paginate(query.page || 1, query.pageSize || 20)
  31. }
  32. }