refactor pagination and FindFilter

This commit is contained in:
AntoXa PRO 2023-10-06 12:08:58 +03:00
parent 31235b363c
commit b1a4be4cf8
3 changed files with 40 additions and 17 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "axp-ts", "name": "axp-ts",
"version": "1.10.0", "version": "1.11.0",
"description": "TypeScript helper library", "description": "TypeScript helper library",
"author": "AntoXa PRO <info@antoxa.pro>", "author": "AntoXa PRO <info@antoxa.pro>",
"homepage": "https://antoxahub.ru/antoxa/axp-ts", "homepage": "https://antoxahub.ru/antoxa/axp-ts",

View File

@ -1,4 +1,4 @@
import type { TPagination } from './pagination' import type { TPaginationQuery } from './pagination'
import { z } from 'zod' import { z } from 'zod'
import { isEqual } from '../utils' import { isEqual } from '../utils'
@ -19,26 +19,30 @@ export const querySchema = cFieldsSchema
export type TQuery = z.infer<typeof querySchema> export type TQuery = z.infer<typeof querySchema>
/** /**
* Объект для преобразования фильтра в URL. * Класс для работы с запросами (для удобства).
*/ */
export type TFindFilter<T extends TQuery> = { export type TFindFilter<T extends TQuery> = {
obj?: Omit<T, 'page' | 'limit' | 'sort'> obj: Omit<T, 'page' | 'limit' | 'sort'>
pagination?: TPagination pagination: TPaginationQuery
sort?: string sort?: string
} }
/**
* Класс для работы с запросами (для удобства).
*/
export class FindFilter<T extends TQuery> implements TFindFilter<T> { export class FindFilter<T extends TQuery> implements TFindFilter<T> {
obj?: Omit<T, 'page' | 'limit' | 'sort'> obj: Omit<T, 'page' | 'limit' | 'sort'>
pagination?: TPagination pagination: TPaginationQuery
sort?: string sort?: string
constructor(query?: T) { constructor(query?: T) {
// Copy fiends.
let queryCopy: T = Object.assign({}, query) let queryCopy: T = Object.assign({}, query)
// Pagination. // Pagination.
this.setPagination(queryCopy) this.pagination = new Pagination(queryCopy).getQuery()
if (this.pagination) { // Delete pagination fields.
// Delete pagination props. if (this.pagination as TPaginationQuery) {
const paginationKeys = Object.keys(this.pagination) as [keyof T] const paginationKeys = Object.keys(this.pagination) as [keyof T]
for (const key of paginationKeys) { for (const key of paginationKeys) {
if (queryCopy[key]) delete queryCopy[key] if (queryCopy[key]) delete queryCopy[key]
@ -48,15 +52,15 @@ export class FindFilter<T extends TQuery> implements TFindFilter<T> {
// Sort. // Sort.
if (queryCopy.sort) { if (queryCopy.sort) {
this.sort = queryCopy.sort this.sort = queryCopy.sort
queryCopy.sort = undefined delete queryCopy.sort
} }
// Obj. // Obj.
this.obj = queryCopy this.obj = queryCopy
} }
setPagination(pagination?: Partial<TPagination>) { setPagination(pagination?: TPaginationQuery) {
this.pagination = new Pagination(pagination).toObject() this.pagination = new Pagination(pagination).getQuery()
} }
toObject(): TFindFilter<T> { toObject(): TFindFilter<T> {

View File

@ -1,6 +1,9 @@
import { z } from 'zod' import { z } from 'zod'
import { cFieldsSchema, fieldSchema } from '../forms' import { cFieldsSchema, fieldSchema } from '../forms'
/**
* Модель данных для пагинайи.
*/
export const paginationSchema = cFieldsSchema export const paginationSchema = cFieldsSchema
.pick({ .pick({
page: true, page: true,
@ -17,10 +20,16 @@ export const paginationSchema = cFieldsSchema
label: 'Кол-во всех страниц' label: 'Кол-во всех страниц'
}) })
}) })
.describe('Пагинация') .describe('Данные пагинации')
/**
* Модель данных для пагинайи.
*/
export type TPagination = z.infer<typeof paginationSchema> export type TPagination = z.infer<typeof paginationSchema>
/**
* Модель данных для пагинайи для запросе.
*/
export const paginationQuerySchema = paginationSchema export const paginationQuerySchema = paginationSchema
.pick({ .pick({
page: true, page: true,
@ -29,19 +38,25 @@ export const paginationQuerySchema = paginationSchema
.partial() .partial()
.describe('Параметры разбиения на страницы') .describe('Параметры разбиения на страницы')
/**
* Модель данных для пагинайи для запросе.
*/
export type TPaginationQuery = z.infer<typeof paginationQuerySchema> export type TPaginationQuery = z.infer<typeof paginationQuerySchema>
// Константы. //
// Переделать.
//
const DEFAULTS = { page: 1, limit: 10, maxLimit: 100 } const DEFAULTS = { page: 1, limit: 10, maxLimit: 100 }
export type TPaginationParseArg = number | string | undefined export type TPaginationParseArg = number | string | undefined
export type TPaginationArguments = { export type TPaginationArguments = {
page?: TPaginationParseArg page?: TPaginationParseArg
limit?: TPaginationParseArg limit?: TPaginationParseArg
total?: number total?: number
} }
/**
* @todo Переделать логику.
*/
export class Pagination implements TPagination { export class Pagination implements TPagination {
/** /**
* Максимальный лимит элементов. * Максимальный лимит элементов.
@ -121,4 +136,8 @@ export class Pagination implements TPagination {
pages: this.pages pages: this.pages
} }
} }
getQuery(): TPaginationQuery {
return { page: this.page, limit: this.limit }
}
} }