PaginationService.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { LucidModel, ModelQueryBuilderContract } from '@ioc:Adonis/Lucid/Orm'
  2. export default class PaginationService<T extends LucidModel> {
  3. protected model: T
  4. constructor(model: T) {
  5. this.model = model
  6. }
  7. public async paginate(
  8. query: any,
  9. injectQuery?: (q: ModelQueryBuilderContract<T, InstanceType<T>>) => void
  10. ) {
  11. let q = this.model.query()
  12. if (injectQuery) {
  13. injectQuery(q)
  14. }
  15. Object.keys(query).forEach((key) => {
  16. if (
  17. ['page', 'pageSize', 'order', 'preload'].includes(key) ||
  18. query[key] === undefined ||
  19. query[key] === null ||
  20. query[key] === ''
  21. ) {
  22. return
  23. }
  24. if (this.model.$hasColumn(key)) {
  25. const col = this.model.$getColumn(key)
  26. if (col?.meta?.type === 'boolean') {
  27. q.where(key, query[key] === 'true' || query[key] === true)
  28. } else {
  29. q.where(key, query[key])
  30. }
  31. }
  32. })
  33. let orders: { column: string; order: 'asc' | 'desc' }[] = []
  34. if (query.order) {
  35. query.order.split(';').forEach((e) => {
  36. let [column, order] = e.split(',')
  37. if (this.model.$hasColumn(column)) {
  38. orders.push({ column, order: order || 'asc' })
  39. }
  40. })
  41. }
  42. if (orders.length === 0 && this.model.$hasColumn('createdAt')) {
  43. orders.push({ column: 'createdAt', order: 'desc' })
  44. }
  45. q.orderBy(orders)
  46. if (query.preload) {
  47. if (query.preload === 'true' || query.preload === true) {
  48. this.model.$relationsDefinitions.forEach((e) => {
  49. q.preload(e.relationName as any)
  50. })
  51. } else {
  52. query.preload.split(',').forEach((e) => {
  53. q.preload(e)
  54. })
  55. }
  56. }
  57. return await q.paginate(query.page || 1, query.pageSize || 20)
  58. }
  59. }