diff --git a/packages/crud-request/src/interfaces/create-query-params.interface.ts b/packages/crud-request/src/interfaces/create-query-params.interface.ts index 2bade000..006af756 100644 --- a/packages/crud-request/src/interfaces/create-query-params.interface.ts +++ b/packages/crud-request/src/interfaces/create-query-params.interface.ts @@ -9,13 +9,13 @@ import { SCondition, } from '../types'; -export interface CreateQueryParams { - fields?: QueryFields; - search?: SCondition; - filter?: QueryFilter | QueryFilterArr | Array; - or?: QueryFilter | QueryFilterArr | Array; - join?: QueryJoin | QueryJoinArr | Array; - sort?: QuerySort | QuerySortArr | Array; +export interface CreateQueryParams { + fields?: QueryFields; + search?: SCondition; + filter?: QueryFilter | QueryFilterArr | Array | QueryFilterArr>; + or?: QueryFilter | QueryFilterArr | Array | QueryFilterArr>; + join?: QueryJoin | QueryJoinArr | Array | QueryJoinArr>; + sort?: QuerySort | QuerySortArr | Array | QuerySortArr>; limit?: number; offset?: number; page?: number; diff --git a/packages/crud-request/src/request-query.builder.ts b/packages/crud-request/src/request-query.builder.ts index 82aa4d99..ed468e7a 100644 --- a/packages/crud-request/src/request-query.builder.ts +++ b/packages/crud-request/src/request-query.builder.ts @@ -28,7 +28,7 @@ import { } from './types'; // tslint:disable:variable-name ban-types -export class RequestQueryBuilder { +export class RequestQueryBuilder { constructor() { this.setParamNames(); } @@ -95,7 +95,7 @@ export class RequestQueryBuilder { return this.queryString; } - select(fields: QueryFields): this { + select(fields: QueryFields): this { if (isArrayFull(fields)) { validateFields(fields); this.queryObject[this.paramNames.fields] = fields.join(this.options.delimStr); @@ -103,44 +103,52 @@ export class RequestQueryBuilder { return this; } - search(s: SCondition) { + search(s: SCondition) { if (!isNil(s) && isObject(s)) { this.queryObject[this.paramNames.search] = JSON.stringify(s); } return this; } - setFilter(f: QueryFilter | QueryFilterArr | Array): this { + setFilter( + f: QueryFilter | QueryFilterArr | Array | QueryFilterArr>, + ): this { this.setCondition(f, 'filter'); return this; } - setOr(f: QueryFilter | QueryFilterArr | Array): this { + setOr( + f: QueryFilter | QueryFilterArr | Array | QueryFilterArr>, + ): this { this.setCondition(f, 'or'); return this; } - setJoin(j: QueryJoin | QueryJoinArr | Array): this { + setJoin( + j: QueryJoin | QueryJoinArr | Array | QueryJoinArr>, + ): this { if (!isNil(j)) { const param = this.checkQueryObjectParam('join', []); this.queryObject[param] = [ ...this.queryObject[param], ...(Array.isArray(j) && !isString(j[0]) - ? (j as Array).map((o) => this.addJoin(o)) - : [this.addJoin(j as QueryJoin | QueryJoinArr)]), + ? (j as Array | QueryJoinArr>).map((o) => this.addJoin(o)) + : [this.addJoin(j as QueryJoin | QueryJoinArr)]), ]; } return this; } - sortBy(s: QuerySort | QuerySortArr | Array): this { + sortBy( + s: QuerySort | QuerySortArr | Array | QuerySortArr>, + ): this { if (!isNil(s)) { const param = this.checkQueryObjectParam('sort', []); this.queryObject[param] = [ ...this.queryObject[param], ...(Array.isArray(s) && !isString(s[0]) - ? (s as Array).map((o) => this.addSortBy(o)) - : [this.addSortBy(s as QuerySort | QuerySortArr)]), + ? (s as Array | QuerySortArr>).map((o) => this.addSortBy(o)) + : [this.addSortBy(s as QuerySort | QuerySortArr)]), ]; } return this; @@ -167,7 +175,7 @@ export class RequestQueryBuilder { } cond( - f: QueryFilter | QueryFilterArr, + f: QueryFilter | QueryFilterArr, cond: 'filter' | 'or' | 'search' = 'search', ): string { const filter = Array.isArray(f) ? { field: f[0], operator: f[1], value: f[2] } : f; @@ -182,7 +190,7 @@ export class RequestQueryBuilder { ); } - private addJoin(j: QueryJoin | QueryJoinArr): string { + private addJoin(j: QueryJoin | QueryJoinArr): string { const join = Array.isArray(j) ? { field: j[0], select: j[1] } : j; validateJoin(join); const d = this.options.delim; @@ -191,7 +199,7 @@ export class RequestQueryBuilder { return join.field + (isArrayFull(join.select) ? d + join.select.join(ds) : ''); } - private addSortBy(s: QuerySort | QuerySortArr): string { + private addSortBy(s: QuerySort | QuerySortArr): string { const sort = Array.isArray(s) ? { field: s[0], order: s[1] } : s; validateSort(sort); const ds = this.options.delimStr; @@ -199,7 +207,7 @@ export class RequestQueryBuilder { return sort.field + ds + sort.order; } - private createFromParams(params: CreateQueryParams): this { + private createFromParams(params: CreateQueryParams): this { this.select(params.fields); this.search(params.search); this.setFilter(params.filter); @@ -227,7 +235,7 @@ export class RequestQueryBuilder { } private setCondition( - f: QueryFilter | QueryFilterArr | Array, + f: QueryFilter | QueryFilterArr | Array | QueryFilterArr>, cond: 'filter' | 'or', ): void { if (!isNil(f)) { @@ -235,8 +243,10 @@ export class RequestQueryBuilder { this.queryObject[param] = [ ...this.queryObject[param], ...(Array.isArray(f) && !isString(f[0]) - ? (f as Array).map((o) => this.cond(o, cond)) - : [this.cond(f as QueryFilter | QueryFilterArr, cond)]), + ? (f as Array | QueryFilterArr>).map((o) => + this.cond(o, cond), + ) + : [this.cond(f as QueryFilter | QueryFilterArr, cond)]), ]; } } diff --git a/packages/crud-request/src/types/request-query.types.ts b/packages/crud-request/src/types/request-query.types.ts index 138e2523..77c8e835 100644 --- a/packages/crud-request/src/types/request-query.types.ts +++ b/packages/crud-request/src/types/request-query.types.ts @@ -1,26 +1,26 @@ -export type QueryFields = string[]; +export type QueryFields = K[]; -export type QueryFilter = { - field: string; +export type QueryFilter = { + field: K; operator: ComparisonOperator; value?: any; }; -export type QueryFilterArr = [string, ComparisonOperator, any?]; +export type QueryFilterArr = [K, ComparisonOperator, any?]; -export type QueryJoin = { - field: string; - select?: QueryFields; +export type QueryJoin = { + field: K; + select?: QueryFields; }; -export type QueryJoinArr = [string, QueryFields?]; +export type QueryJoinArr = [K, QueryFields?]; -export type QuerySort = { - field: string; +export type QuerySort = { + field: K; order: QuerySortOperator; }; -export type QuerySortArr = [string, QuerySortOperator]; +export type QuerySortArr = [K, QuerySortOperator]; export type QuerySortOperator = 'ASC' | 'DESC'; @@ -104,17 +104,18 @@ export type SFieldOperator = { export type SField = SPrimitivesVal | SFieldOperator; -export type SFields = { - [key: string]: SField | Array | undefined; - $or?: Array; +export type SFields = { + $or?: Array | SConditionAND>; $and?: never; +} & { + [key in K]?: SField | Array | SConditionAND> | undefined; }; -export type SConditionAND = { - $and?: Array; +export type SConditionAND = { + $and?: Array | SConditionAND>; $or?: never; }; export type SConditionKey = '$and' | '$or'; -export type SCondition = SFields | SConditionAND; +export type SCondition = SFields | SConditionAND;