Skip to content

Commit

Permalink
Merge 162e33e into 644acfd
Browse files Browse the repository at this point in the history
  • Loading branch information
SamiSammour committed Jul 14, 2020
2 parents 644acfd + 162e33e commit 944dcfb
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 5 deletions.
13 changes: 10 additions & 3 deletions packages/crud-typeorm/src/typeorm-crud.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ export class TypeOrmCrudService<T> extends CrudService<T> {
const joinOptions = options.query.join || {};
const allowedJoins = objKeys(joinOptions);

if (hasLength(allowedJoins)) {
if (hasLength(allowedJoins) || joinOptions === true) {
const eagerJoins: any = {};

for (let i = 0; i < allowedJoins.length; i++) {
Expand All @@ -292,16 +292,23 @@ export class TypeOrmCrudService<T> extends CrudService<T> {
const cond = parsed.join.find((j) => j && j.field === allowedJoins[i]) || {
field: allowedJoins[i],
};
this.setJoin(cond, joinOptions, builder);
this.setJoin(cond, joinOptions as JoinOptions, builder);
eagerJoins[allowedJoins[i]] = true;
}
}

if (isArrayFull(parsed.join)) {
const parsedJoins: JoinOptions = parsed.join
.map((p) => ({ [p.field]: { allow: p.select } }))
.reduce((prev, curr) => ({ ...prev, ...curr }), {});
for (let i = 0; i < parsed.join.length; i++) {
/* istanbul ignore else */
if (!eagerJoins[parsed.join[i].field]) {
this.setJoin(parsed.join[i], joinOptions, builder);
this.setJoin(
parsed.join[i],
joinOptions === true ? parsedJoins : joinOptions,
builder,
);
}
}
}
Expand Down
52 changes: 51 additions & 1 deletion packages/crud-typeorm/test/b.query-params.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,17 @@ describe('#crud-typeorm', () => {
constructor(public service: UsersService) {}
}

@Crud({
model: { type: User },
query: {
join: true,
},
})
@Controller('users3')
class UsersController3 {
constructor(public service: UsersService) {}
}

@Crud({
model: { type: User },
query: {
Expand All @@ -151,7 +162,7 @@ describe('#crud-typeorm', () => {
},
})
@Controller('myusers')
class UsersController3 {
class UsersController4 {
constructor(public service: UsersService2) {}
}

Expand All @@ -178,6 +189,7 @@ describe('#crud-typeorm', () => {
UsersController,
UsersController2,
UsersController3,
UsersController4,
NotesController,
],
providers: [
Expand Down Expand Up @@ -529,6 +541,44 @@ describe('#crud-typeorm', () => {
});
});

describe('#query any join relation', () => {
it('should return joined relation', (done) => {
const query = qb.setJoin({ field: 'company', select: ['name'] }).query();
return request(server)
.get('/users3')
.query(query)
.end((_, res) => {
expect(res.status).toBe(200);
expect(res.body).toBeArray();
res.body.forEach((user) => {
expect(user.company).toBeDefined();
expect(user.company.name).toBeDefined();
});
done();
});
});
it('should allow joining nested relation', (done) => {
const query = qb
.setJoin({ field: 'company', select: ['name'] })
.setJoin({ field: 'company.projects' })
.query();
return request(server)
.get('/users3')
.query(query)
.end((_, res) => {
expect(res.status).toBe(200);
expect(res.body).toBeArray();
res.body.forEach((user) => {
expect(user.company).toBeDefined();
expect(user.company.name).toBeDefined();
expect(user.company.projects).toBeDefined();
expect(user.company.projects).toBeArray();
});
done();
});
});
});

describe('#sort', () => {
it('should sort by field', async () => {
const query = qb.sortBy({ field: 'id', order: 'DESC' }).query();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export interface CrudGlobalConfig {
maxLimit?: number;
cache?: number | false;
alwaysPaginate?: boolean;
join?: boolean;
};
serialize?: {
getMany?: false;
Expand Down
2 changes: 1 addition & 1 deletion packages/crud/src/interfaces/query-options.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export interface QueryOptions {
exclude?: QueryFields;
persist?: QueryFields;
filter?: QueryFilterOption;
join?: JoinOptions;
join?: JoinOptions | boolean;
sort?: QuerySort[];
limit?: number;
maxLimit?: number;
Expand Down
4 changes: 4 additions & 0 deletions packages/crud/test/crud-config.service.global.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { CrudConfigService } from '../src/module/crud-config.service';
const conf: CrudGlobalConfig = {
query: {
limit: 10,
join: true,
},
params: {
id: {
Expand Down Expand Up @@ -60,6 +61,7 @@ describe('#crud', () => {
model: { type: TestModel },
query: {
limit: 12,
join: false,
},
params: {
id: {
Expand Down Expand Up @@ -114,6 +116,7 @@ describe('#crud', () => {
expect(res.body.req.options.routes.replaceOneBase.allowParamsOverride).toBe(
true,
);
expect(res.body.req.options.query.join).toBe(true);
done();
});
});
Expand All @@ -139,6 +142,7 @@ describe('#crud', () => {
false,
);
expect(res.body.req.options.routes.deleteOneBase.returnDeleted).toBe(true);
expect(res.body.req.options.query.join).toBe(false);
done();
});
});
Expand Down

0 comments on commit 944dcfb

Please sign in to comment.