Skip to content

Commit

Permalink
feat(crud-typeorm): Adds alwaysPaginate global option and makes pagin…
Browse files Browse the repository at this point in the history
…ation default

BREAKING CHANGE: getManyBase now returns a paginated result by default unless opted out by setting
`alwaysPaginate: false`

re nestjsx#213
  • Loading branch information
jdguzman committed Oct 9, 2019
1 parent 00bc044 commit 27192db
Show file tree
Hide file tree
Showing 6 changed files with 159 additions and 1 deletion.
10 changes: 10 additions & 0 deletions packages/crud-typeorm/src/typeorm-crud.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,16 @@ export class TypeOrmCrudService<T> extends CrudService<T> {
*/
public async getMany(req: CrudRequest): Promise<GetManyDefaultResponse<T> | T[]> {
const { parsed, options } = req;

if (options.query.alwaysPaginate) {
if (parsed.page === undefined) {
parsed.page = 1;
}
if (!parsed.limit && !options.query.limit) {
options.query.limit = 10; // default to 10?
}
}

const builder = await this.createBuilder(parsed, options);

if (this.decidePagination(parsed, options)) {
Expand Down
3 changes: 3 additions & 0 deletions packages/crud-typeorm/test/b.query-params.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { Crud } from '../../crud/src/decorators/crud.decorator';
import { CompaniesService } from './__fixture__/companies.service';
import { ProjectsService } from './__fixture__/projects.service';
import { UsersService } from './__fixture__/users.service';
import { CrudConfigService } from '../../crud/src/module';

// tslint:disable:max-classes-per-file
describe('#crud-typeorm', () => {
Expand All @@ -24,6 +25,8 @@ describe('#crud-typeorm', () => {
let server: any;
let qb: RequestQueryBuilder;

CrudConfigService.load({ query: { alwaysPaginate: false } });

@Crud({
model: { type: Company },
query: {
Expand Down
141 changes: 141 additions & 0 deletions packages/crud-typeorm/test/c.basic-crud.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,156 @@ import { UserProfile } from '../../../integration/crud-typeorm/users-profiles';
import { HttpExceptionFilter } from '../../../integration/shared/https-exception.filter';
import { CompaniesService } from './__fixture__/companies.service';
import { UsersService } from './__fixture__/users.service';
import { CrudConfigService } from '../../crud/src/module';

// tslint:disable:max-classes-per-file no-shadowed-variable
describe('#crud-typeorm', () => {
describe('#basic crud using alwaysPaginate default respects global limit', () => {
let app: INestApplication;
let server: any;
let qb: RequestQueryBuilder;
let service: CompaniesService;

CrudConfigService.load({ query: { limit: 5 } });

@Crud({
model: { type: Company },
})
@Controller('companies')
class CompaniesController {
constructor(public service: CompaniesService) {}
}

beforeAll(async () => {
const fixture = await Test.createTestingModule({
imports: [TypeOrmModule.forRoot(withCache), TypeOrmModule.forFeature([Company])],
controllers: [CompaniesController],
providers: [
{ provide: APP_FILTER, useClass: HttpExceptionFilter },
CompaniesService,
],
}).compile();

app = fixture.createNestApplication();
service = app.get<CompaniesService>(CompaniesService);

await app.init();
server = app.getHttpServer();
});

beforeEach(() => {
qb = RequestQueryBuilder.create();
});

afterAll(async () => {
await app.close();
});

describe('#getAllBase', () => {
it('should return an array of all entities', (done) => {
return request(server)
.get('/companies')
.end((_, res) => {
expect(res.status).toBe(200);
expect(res.body.data.length).toBe(5);
expect(res.body.page).toBe(1);
done();
});
});
});
});

describe('#basic crud using alwaysPaginate default', () => {
let app: INestApplication;
let server: any;
let qb: RequestQueryBuilder;
let service: CompaniesService;

CrudConfigService.load({ query: { limit: undefined } });

@Crud({
model: { type: Company },
})
@Controller('companies')
class CompaniesController {
constructor(public service: CompaniesService) {}
}

beforeAll(async () => {
const fixture = await Test.createTestingModule({
imports: [TypeOrmModule.forRoot(withCache), TypeOrmModule.forFeature([Company])],
controllers: [CompaniesController],
providers: [
{ provide: APP_FILTER, useClass: HttpExceptionFilter },
CompaniesService,
],
}).compile();

app = fixture.createNestApplication();
service = app.get<CompaniesService>(CompaniesService);

await app.init();
server = app.getHttpServer();
});

beforeEach(() => {
qb = RequestQueryBuilder.create();
});

afterAll(async () => {
await app.close();
});

describe('#getAllBase', () => {
it('should return an array of all entities', (done) => {
return request(server)
.get('/companies')
.end((_, res) => {
expect(res.status).toBe(200);
expect(res.body.data.length).toBe(10);
expect(res.body.page).toBe(1);
done();
});
});
it('should return an entities with limit', (done) => {
const query = qb.setLimit(5).query();
return request(server)
.get('/companies')
.query(query)
.end((_, res) => {
expect(res.status).toBe(200);
expect(res.body.data.length).toBe(5);
expect(res.body.page).toBe(1);
done();
});
});
it('should return an entities with limit and page', (done) => {
const query = qb
.setLimit(3)
.setPage(1)
.sortBy({ field: 'id', order: 'DESC' })
.query();
return request(server)
.get('/companies')
.query(query)
.end((_, res) => {
expect(res.status).toBe(200);
expect(res.body.data.length).toBe(3);
expect(res.body.count).toBe(3);
expect(res.body.page).toBe(1);
done();
});
});
});
});
describe('#basic crud', () => {
let app: INestApplication;
let server: any;
let qb: RequestQueryBuilder;
let service: CompaniesService;

CrudConfigService.load({ query: { alwaysPaginate: false } });

@Crud({
model: { type: Company },
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ export interface CrudGlobalConfig {
limit?: number;
maxLimit?: number;
cache?: number | false;
alwaysPaginate?: boolean;
};
}
1 change: 1 addition & 0 deletions packages/crud/src/interfaces/query-options.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export interface QueryOptions {
limit?: number;
maxLimit?: number;
cache?: number | false;
alwaysPaginate?: boolean;
}

export interface JoinOptions {
Expand Down
4 changes: 3 additions & 1 deletion packages/crud/src/module/crud-config.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import { CrudGlobalConfig } from '../interfaces';

export class CrudConfigService {
static config: CrudGlobalConfig = {
query: {},
query: {
alwaysPaginate: true,
},
routes: {
getManyBase: { interceptors: [], decorators: [] },
getOneBase: { interceptors: [], decorators: [] },
Expand Down

0 comments on commit 27192db

Please sign in to comment.