Skip to content

Commit

Permalink
Merge pull request #478 from jiho-kr/feature/swagger-body
Browse files Browse the repository at this point in the history
feat: override swagger body
  • Loading branch information
jiho-kr committed Mar 11, 2024
2 parents 2133cb9 + 6ec4446 commit 867aeca
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 3 deletions.
6 changes: 3 additions & 3 deletions spec/exclude-swagger/exclude-swagger.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,14 +101,14 @@ describe('exclude swagger by route', () => {
content: {
'application/json': {
schema: {
$ref: '#/components/schemas/CreateBaseBodyDto',
$ref: '#/components/schemas/PickTypeClass',
anyOf: [
{
$ref: '#/components/schemas/CreateBaseBodyDto',
$ref: '#/components/schemas/PickTypeClass',
},
{
items: {
$ref: '#/components/schemas/CreateBaseBodyDto',
$ref: '#/components/schemas/PickTypeClass',
},
type: 'array',
},
Expand Down
6 changes: 6 additions & 0 deletions spec/swagger-decorator/swagger-decorator.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Controller } from '@nestjs/common';
import { ApiParam } from '@nestjs/swagger';

import { ParamsRequestInterceptor } from './params.request.interceptor';
import { UpdateRequestDto } from './update-request.dto';
import { Crud } from '../../src/lib/crud.decorator';
import { CrudController } from '../../src/lib/interface';
import { BaseEntity } from '../base/base.entity';
Expand All @@ -22,6 +23,11 @@ import { BaseService } from '../base/base.service';
interceptors: [ParamsRequestInterceptor],
decorators: [ApiParam({ name: 'key', required: true })],
},
update: {
swagger: {
body: UpdateRequestDto,
},
},
},
})
@Controller('swagger-decorator/:key')
Expand Down
17 changes: 17 additions & 0 deletions spec/swagger-decorator/swagger-decorator.spec.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,33 @@
import { HttpStatus, INestApplication } from '@nestjs/common';
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
import { DenormalizedDoc } from '@nestjs/swagger/dist/interfaces/denormalized-doc.interface';
import { RequestBodyObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';
import { Test, TestingModule } from '@nestjs/testing';
import request from 'supertest';

import { SwaggerDecoratorController } from './swagger-decorator.controller';
import { SwaggerDecoratorModule } from './swagger-decorator.module';
import { BaseEntity } from '../base/base.entity';
import { TestHelper } from '../test.helper';

describe('SwaggerDecorator', () => {
let app: INestApplication;
let routeSet: Record<string, DenormalizedDoc>;

beforeAll(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [SwaggerDecoratorModule, TestHelper.getTypeOrmMysqlModule([BaseEntity])],
}).compile();

app = moduleFixture.createNestApplication();
const controller = moduleFixture.get<SwaggerDecoratorController>(SwaggerDecoratorController);

await app.init();

routeSet = TestHelper.getSwaggerExplorer({
instance: controller,
metatype: SwaggerDecoratorController,
} as InstanceWrapper<SwaggerDecoratorController>);
});

afterAll(async () => {
Expand All @@ -43,4 +54,10 @@ describe('SwaggerDecorator', () => {
.expect(HttpStatus.OK);
expect(readOneBody.name).toEqual('name');
});

it('should be override swagger decorator', async () => {
expect((routeSet['patch /swagger-decorator/{key}/{id}'].root?.requestBody as RequestBodyObject)?.description).toEqual(
'UpdateBaseDto',
);
});
});
8 changes: 8 additions & 0 deletions spec/swagger-decorator/update-request.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { ApiPropertyOptional } from '@nestjs/swagger';

import { BaseEntity } from '../base/base.entity';

export class UpdateRequestDto implements Partial<BaseEntity> {
@ApiPropertyOptional({ description: 'optional name', type: String })
name: string;
}
4 changes: 4 additions & 0 deletions src/lib/crud.route.factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,10 @@ export class CrudRouteFactory {
}
if (CRUD_POLICY[method].useBody) {
const bodyType = (() => {
const customBody = this.crudOptions.routes?.[method]?.swagger?.body;
if (customBody != null) {
return customBody;
}
if (method === Method.SEARCH) {
return RequestSearchDto;
}
Expand Down
4 changes: 4 additions & 0 deletions src/lib/interface/decorator-option.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ interface RouteBaseOption {
* Configures the Swagger documentation for the route's response
*/
response?: Type<unknown>;
/**
* Configures the Swagger documentation for the route's request body
*/
body?: Type<unknown>;
};
/**
* Configures the keys of entity to exclude from the route's response
Expand Down

0 comments on commit 867aeca

Please sign in to comment.