Skip to content

Commit 6e19cb2

Browse files
authored
Merge pull request #46 from klerick/condition-by-reletion
fix(json-api-nestjs): fix test for prev commit
2 parents 09140ec + 35c1833 commit 6e19cb2

File tree

4 files changed

+55
-50
lines changed

4 files changed

+55
-50
lines changed

libs/json-api-nestjs/src/lib/mixin/service/typeorm/methods/get-all/get-all.spec.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -317,14 +317,19 @@ describe('GetAll methode test', () => {
317317
},
318318
});
319319

320-
expect(joinSpy).toBeCalledTimes(2);
320+
expect(joinSpy).toBeCalledTimes(3);
321321
expect(joinSpy).toHaveBeenNthCalledWith(
322322
1,
323+
`${aliasString}.comments`,
324+
'comments'
325+
);
326+
expect(joinSpy).toHaveBeenNthCalledWith(
327+
2,
323328
`${aliasString}.manager`,
324329
'manager'
325330
);
326331
expect(joinSpy).toHaveBeenNthCalledWith(
327-
2,
332+
3,
328333
`${aliasString}.addresses`,
329334
'addresses'
330335
);
@@ -353,7 +358,7 @@ describe('GetAll methode test', () => {
353358
expect(result.meta.totalItems).toBe(0);
354359
expect(result.meta.pageSize).toBe(page.size);
355360

356-
expect(resultJoinSpy).toBeCalledTimes(2);
361+
expect(resultJoinSpy).toBeCalledTimes(4);
357362
expect(resultJoinSpy).toHaveBeenNthCalledWith(
358363
1,
359364
`${aliasString}.${include[0]}`,
@@ -469,14 +474,19 @@ describe('GetAll methode test', () => {
469474
},
470475
});
471476

472-
expect(joinSpy).toBeCalledTimes(2);
477+
expect(joinSpy).toBeCalledTimes(3);
473478
expect(joinSpy).toHaveBeenNthCalledWith(
474479
1,
480+
`${alisString}.comments`,
481+
'comments'
482+
);
483+
expect(joinSpy).toHaveBeenNthCalledWith(
484+
2,
475485
`${alisString}.manager`,
476486
'manager'
477487
);
478488
expect(joinSpy).toHaveBeenNthCalledWith(
479-
2,
489+
3,
480490
`${alisString}.addresses`,
481491
'addresses'
482492
);

libs/json-api-nestjs/src/lib/mixin/service/typeorm/methods/get-all/get-all.ts

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
import { BadRequestException } from '@nestjs/common';
2-
import { OrderByCondition } from 'typeorm/find-options/OrderByCondition';
1+
import {BadRequestException} from '@nestjs/common';
2+
import {OrderByCondition} from 'typeorm/find-options/OrderByCondition';
33

4-
import { TypeormMixinService } from '../../typeorm.mixin';
5-
import { ServiceOptions, SortType } from '../../../../../types';
6-
import { ResourceObject } from '../../../../../types-common';
4+
import {TypeormMixinService} from '../../typeorm.mixin';
5+
import {ServiceOptions, SortType} from '../../../../../types';
6+
import {ResourceObject} from '../../../../../types-common';
77

8-
import { snakeToCamel } from '../../../../../helper';
8+
import {snakeToCamel} from '../../../../../helper';
99

1010
export async function getAll<T>(
1111
this: TypeormMixinService<T>,
1212
options: ServiceOptions<T>
1313
): Promise<ResourceObject<T>> {
1414
const startTime = Date.now();
15-
const { filter, include, sort, page, fields } = options.query;
15+
const {filter, include, sort, page, fields} = options.query;
1616
if (this.config.requiredSelectField && fields === null) {
1717
throw new BadRequestException([
1818
{
19-
source: { parameter: '/fields' },
19+
source: {parameter: '/fields'},
2020
detail: 'Fields params in query is required',
2121
},
2222
]);
@@ -54,7 +54,7 @@ export async function getAll<T>(
5454
fieldsSelect.add(`${rel}.${propsName}`);
5555
}
5656

57-
const { target, ...other } = fields;
57+
const {target, ...other} = fields;
5858
const targetArray =
5959
[...target, this.repository.metadata.primaryColumns[0].propertyName] ||
6060
[];
@@ -69,7 +69,7 @@ export async function getAll<T>(
6969
});
7070
}
7171

72-
const { target, relation } = filter;
72+
const {target, relation} = filter;
7373

7474
const expressionObjectForRelation = relation
7575
? this.UtilsMethode.applyQueryFilterRelation(
@@ -94,14 +94,14 @@ export async function getAll<T>(
9494
const joinForCommonQuery = {};
9595

9696
for (let i = 0; i < expressionObjectLength; i++) {
97-
const { expression, params, selectInclude } = expressionObject[i];
97+
const {expression, params, selectInclude} = expressionObject[i];
9898
if (selectInclude) {
9999
joinForCommonQuery[`${preparedResourceName}.${selectInclude}`] =
100100
selectInclude;
101101
}
102102
builder[i === 0 ? 'where' : 'andWhere'](expression);
103103
if (params) {
104-
builder.setParameters(params ? { [params.name]: params.val } : {});
104+
builder.setParameters(params ? {[params.name]: params.val} : {});
105105
}
106106
}
107107
for (let i = 0; i < includeLength; i++) {
@@ -116,7 +116,7 @@ export async function getAll<T>(
116116
builder.select(`${preparedResourceName}.${primaryColumn}`, subQueryIdAlias);
117117

118118
if (sort) {
119-
const { target, ...otherSort } = sort;
119+
const {target, ...otherSort} = sort;
120120
const targetOrder = Object.entries<SortType>(
121121
target || {}
122122
).reduce<OrderByCondition>((acum, [key, val]) => {
@@ -172,19 +172,27 @@ export async function getAll<T>(
172172

173173
const resultBuilder = resultBuilderQuery
174174
.select([...fieldsSelect])
175-
.whereInIds(resultIds.map((i) => i[`${countAlias}_${primaryColumn}`]));
175+
const ids = resultIds.map((i) => i[`${countAlias}_${primaryColumn}`]);
176+
if (ids.length > 0) {
177+
resultBuilder.whereInIds(resultIds.map((i) => i[`${countAlias}_${primaryColumn}`]));
178+
}
176179

177180
for (let i = 0; i < expressionObjectForRelation.length; i++) {
178-
const { expression, params, selectInclude } =
181+
const {expression, params, selectInclude} =
179182
expressionObjectForRelation[i];
180-
if (selectInclude) {
183+
if (selectInclude && !include.includes(selectInclude as any)) {
181184
resultBuilder.leftJoin(
182185
`${preparedResourceName}.${selectInclude}`,
183186
selectInclude
184187
);
185188
}
186-
resultBuilder.andWhere(expression);
187-
resultBuilder.setParameters(params ? { [params.name]: params.val } : {});
189+
if (i === 0 && ids.length === 0) {
190+
resultBuilder.where(expression);
191+
} else {
192+
resultBuilder.andWhere(expression);
193+
}
194+
195+
resultBuilder.setParameters(params ? {[params.name]: params.val} : {});
188196
}
189197

190198
const result = await resultBuilder.getRawMany();
@@ -206,7 +214,7 @@ export async function getAll<T>(
206214
pageNumber: page.number,
207215
totalItems: count,
208216
pageSize: page.size,
209-
...(this.config.debug ? { debug } : {}),
217+
...(this.config.debug ? {debug} : {}),
210218
},
211219
data,
212220
included,

libs/json-api-nestjs/src/lib/mixin/service/typeorm/utils/utils-methode.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,8 @@ describe('Utils methode test', () => {
483483
)}`
484484
)
485485
.getQuery();
486-
const check = `${alias}.id IN (${resultQuery})`;
486+
// const check = `${alias}.id IN (${resultQuery})`;
487+
const check = `comments.kind = :params_comments.kind_0`;
487488
expect(expression[i].expression).toBe(check);
488489
expect(expression[i].params.val).toBe(
489490
filter[relName][fieldName][operand]

libs/json-api-nestjs/src/lib/mixin/service/typeorm/utils/utils-methode.ts

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -267,32 +267,18 @@ export class UtilsMethode {
267267
break;
268268
}
269269
case 'one-to-many': {
270-
if (paramsField !== null) {
271-
resultExpression.push({
272-
expression: `${relationProperty}.${relationFieldProperty.toString()} ${currentOperandMap[
273-
operand
274-
].replace('EXPRESSION', paramsField)}`,
275-
params: {
276-
val: value,
277-
name: paramsField,
278-
},
279-
selectInclude: relationProperty,
280-
});
281-
break;
282-
}
283-
const query = builder
284-
.subQuery()
285-
.select(`${resourceName}.${inverseSidePropertyPath}`)
286-
.from(target, resourceName)
287-
.where(
288-
`${resourceName}.${relationFieldProperty.toString()} ${currentOperandMap[
289-
operand
290-
].replace('EXPRESSION', paramsField)}`
291-
)
292-
.getQuery();
293270
resultExpression.push({
294-
expression: `${preparedResourceName}.id IN ${query}`,
295-
params: null,
271+
expression: `${relationProperty}.${relationFieldProperty.toString()} ${currentOperandMap[
272+
operand
273+
].replace('EXPRESSION', paramsField)}`,
274+
params:
275+
paramsField === null
276+
? null
277+
: {
278+
val: value,
279+
name: paramsField,
280+
},
281+
selectInclude: relationProperty,
296282
});
297283
break;
298284
}

0 commit comments

Comments
 (0)