Skip to content

Commit

Permalink
Merge f273167 into 76dc6c2
Browse files Browse the repository at this point in the history
  • Loading branch information
Diluka committed Feb 26, 2020
2 parents 76dc6c2 + f273167 commit 5750e47
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 19 deletions.
13 changes: 6 additions & 7 deletions packages/crud/src/interceptors/crud-base.interceptor.ts
Expand Up @@ -14,13 +14,12 @@ export class CrudBaseInterceptor {
const ctrl = context.getClass();
const handler = context.getHandler();
const ctrlOptions = R.getCrudOptions(ctrl);
const crudOptions = ctrlOptions
? ctrlOptions
: {
query: {},
routes: {},
params: {},
};
const methodOptions = R.getCrudOptions(handler);
const { query: methodQuery, params: methodParams } = { ...methodOptions };
const { query: ctrlQuery, params: ctrlParams, ...ctrlOthers } = { ...ctrlOptions };
const query = { ...ctrlQuery, ...methodQuery };
const params = { ...ctrlParams, ...methodParams };
const crudOptions = { query, params, routes: {}, ...ctrlOthers };
const action = R.getAction(handler);

return { ctrlOptions, crudOptions, action };
Expand Down
9 changes: 3 additions & 6 deletions packages/crud/src/interfaces/crud-options.interface.ts
@@ -1,11 +1,11 @@
import { ValidationPipeOptions } from '@nestjs/common';
import { AuthOptions } from './auth-options.interface';
import { DtoOptions } from './dto-options.interface';

import { ModelOptions } from './model-options.interface';
import { ParamsOptions } from './params-options.interface';
import { QueryOptions } from './query-options.interface';
import { RoutesOptions } from './routes-options.interface';
import { AuthOptions } from './auth-options.interface';
import { DtoOptions } from './dto-options.interface';
import { SerializeOptions } from './serialize-options.interface';

export interface CrudRequestOptions {
Expand All @@ -14,13 +14,10 @@ export interface CrudRequestOptions {
params?: ParamsOptions;
}

export interface CrudOptions {
export interface CrudOptions extends CrudRequestOptions {
model: ModelOptions;
dto?: DtoOptions;
serialize?: SerializeOptions;
query?: QueryOptions;
routes?: RoutesOptions;
params?: ParamsOptions;
validation?: ValidationPipeOptions | false;
}

Expand Down
38 changes: 32 additions & 6 deletions packages/crud/test/crud.decorator.options.spec.ts
@@ -1,10 +1,12 @@
import * as request from 'supertest';
import { Test } from '@nestjs/testing';
import { Controller, INestApplication } from '@nestjs/common';
import { Controller, Get, INestApplication, SetMetadata, UseInterceptors } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';
import { Test } from '@nestjs/testing';
import * as request from 'supertest';
import { CrudRequestInterceptor } from '../lib/interceptors';

import { Crud } from '../src/decorators';
import { CrudOptions } from '../src/interfaces';
import { CRUD_OPTIONS_METADATA } from '../src/constants';
import { Crud, ParsedRequest } from '../src/decorators';
import { CrudOptions, CrudRequest, CrudRequestOptions } from '../src/interfaces';
import { HttpExceptionFilter } from './__fixture__/exception.filter';
import { TestModel } from './__fixture__/models';
import { TestService } from './__fixture__/services';
Expand All @@ -24,6 +26,7 @@ describe('#crud', () => {
},
},
query: {
filter: { name: 'test' },
limit: 10,
},
routes: {
Expand Down Expand Up @@ -60,11 +63,24 @@ describe('#crud', () => {
},
},
};
const additionalOptions: CrudRequestOptions = {
query: {
filter: [{ field: 'for_method_a_only', operator: 'eq', value: true }],
},
};

@Crud(options)
@Controller('test')
class TestController {
constructor(public service: TestService<TestModel>) {}
constructor(public service: TestService<TestModel>) {
}

@SetMetadata(CRUD_OPTIONS_METADATA, additionalOptions)
@Get('method-a')
@UseInterceptors(CrudRequestInterceptor)
methodA(@ParsedRequest() req: CrudRequest) {
return { req };
}
}

beforeAll(async () => {
Expand Down Expand Up @@ -95,5 +111,15 @@ describe('#crud', () => {
done();
});
});

it('should return method options in ParsedRequest', async () => {
const res = await request(server)
.get('/test/method-a')
.expect(200);

const opt = res.body.req.options;

expect(opt.query).toMatchObject({ ...options.query, ...additionalOptions.query });
});
});
});

0 comments on commit 5750e47

Please sign in to comment.