Skip to content

Commit f3b4491

Browse files
[typescript-nestjs-server] #22928 correctly parse numeric parameters, use DefaultValuePipe for default values
1 parent cd3b9a1 commit f3b4491

19 files changed

Lines changed: 115 additions & 20 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNestjsServerCodegen.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,9 @@ public void processOpts() {
156156
supportingFiles.add(new SupportingFile("api-implementations.mustache", "", "api-implementations.ts"));
157157
supportingFiles.add(new SupportingFile("api.module.mustache", "", "api.module.ts"));
158158
supportingFiles.add(new SupportingFile("controllers.mustache", "controllers", "index.ts"));
159-
supportingFiles.add(new SupportingFile("cookies-decorator.mustache", "cookies-decorator.ts"));
159+
supportingFiles.add(new SupportingFile("cookies-decorator.mustache", "decorators", "cookies-decorator.ts"));
160+
supportingFiles.add(new SupportingFile("headers-decorator.mustache", "decorators", "headers-decorator.ts"));
161+
supportingFiles.add(new SupportingFile("decorators.mustache", "decorators", "index.ts"));
160162
supportingFiles.add(new SupportingFile("gitignore", "", ".gitignore"));
161163
supportingFiles.add(new SupportingFile("README.md", "", "README.md"));
162164
supportingFiles.add(new SupportingFile("tsconfig.mustache", "", "tsconfig.json"));

modules/openapi-generator/src/main/resources/typescript-nestjs-server/controller.mustache

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Body, Controller{{#httpMethods}}, {{.}}{{/httpMethods}}, Param, Query, Headers, Req } from '@nestjs/common';
1+
import { Body, Controller, DefaultValuePipe{{#httpMethods}}, {{.}}{{/httpMethods}}, Param, ParseIntPipe, ParseFloatPipe, Query, Req } from '@nestjs/common';
22
import { Observable } from 'rxjs';
3-
import { Cookies } from '../cookies-decorator';
3+
import { Cookies, Headers } from '../decorators';
44
import { {{classname}} } from '../{{apiPackage}}';
55
{{#tsImports.0}}
66
import { {{#tsImports}}{{classname}}, {{/tsImports}} } from '../{{modelPackage}}';
@@ -13,7 +13,7 @@ export class {{classname}}Controller {
1313
{{#operations}}
1414
{{#operation}}
1515
@{{#vendorExtensions.x-http-method}}{{.}}{{/vendorExtensions.x-http-method}}{{^vendorExtensions.x-http-method}}{{httpMethod}}{{/vendorExtensions.x-http-method}}('{{path}}')
16-
{{operationId}}({{#allParams}}{{#isPathParam}}@Param('{{baseName}}') {{/isPathParam}}{{#isQueryParam}}@Query('{{baseName}}') {{/isQueryParam}}{{#isHeaderParam}}@Headers('{{baseName}}') {{/isHeaderParam}}{{#isCookieParam}}@Cookies('{{baseName}}') {{/isCookieParam}}{{#isBodyParam}}@Body() {{/isBodyParam}}{{paramName}}: {{{dataType}}}{{#isNullable}} | null{{/isNullable}}{{^required}} | undefined{{/required}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}, {{/allParams}}@Req() request: Request): {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} | Promise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> | Observable<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {
16+
{{operationId}}({{#allParams}}{{#isPathParam}}@Param('{{baseName}}'{{>paramPipe}}) {{/isPathParam}}{{#isQueryParam}}@Query('{{baseName}}'{{>paramPipe}}) {{/isQueryParam}}{{#isHeaderParam}}@Headers('{{baseName}}'{{>paramPipe}}) {{/isHeaderParam}}{{#isCookieParam}}@Cookies('{{baseName}}'{{>paramPipe}}) {{/isCookieParam}}{{#isBodyParam}}@Body() {{/isBodyParam}}{{paramName}}: {{{dataType}}}{{#isNullable}} | null{{/isNullable}}{{^required}} | undefined{{/required}}, {{/allParams}}@Req() request: Request): {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} | Promise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> | Observable<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {
1717
return this.{{classVarName}}.{{operationId}}({{#useSingleRequestParameter}}{ {{/useSingleRequestParameter}}{{#allParams}}{{paramName}}, {{/allParams}}{{#useSingleRequestParameter}}}, {{/useSingleRequestParameter}}request);
1818
}
1919

modules/openapi-generator/src/main/resources/typescript-nestjs-server/cookies-decorator.mustache

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,8 @@ import { createParamDecorator, ExecutionContext } from '@nestjs/common';
1717
*/
1818
export const Cookies = createParamDecorator((data: string, ctx: ExecutionContext) => {
1919
const request = ctx.switchToHttp().getRequest();
20-
return data ? request.cookies?.[data] : request.cookies;
20+
if (!data) {
21+
return { ...request.cookies, ...request.signedCookies };
22+
}
23+
return request.cookies?.[data] ?? request.signedCookies?.[data];
2124
});
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './cookies-decorator';
2+
export * from './headers-decorator';
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
2+
3+
/**
4+
* A decorator function for retrieving headers from the request object in an HTTP context.
5+
* Workaround for enabling PipeTransformers on Headers (see https://github.com/nestjs/nest/issues/356)
6+
*
7+
* Usage:
8+
* ```
9+
* @Get()
10+
* findAll(@Headers('name') name: string) {}
11+
* ```
12+
*/
13+
export const Headers = createParamDecorator((data: string, ctx: ExecutionContext) => {
14+
const request = ctx.switchToHttp().getRequest();
15+
return data ? request.headers?.[data] : request.headers;
16+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{#defaultValue}}, new DefaultValuePipe({{{defaultValue}}}){{/defaultValue}}{{#isNumber}}, {{#isFloat}}ParseFloatPipe{{/isFloat}}{{^isFloat}}ParseIntPipe{{/isFloat}}{{/isNumber}}

samples/server/petstore/typescript-nestjs-server/builds/default/.openapi-generator/FILES

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ controllers/PetApi.controller.ts
1010
controllers/StoreApi.controller.ts
1111
controllers/UserApi.controller.ts
1212
controllers/index.ts
13-
cookies-decorator.ts
13+
decorators/cookies-decorator.ts
14+
decorators/headers-decorator.ts
15+
decorators/index.ts
1416
index.ts
1517
models/api-response.ts
1618
models/category.ts

samples/server/petstore/typescript-nestjs-server/builds/default/controllers/PetApi.controller.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Body, Controller, Delete, Get, Post, Put, Param, Query, Headers, Req } from '@nestjs/common';
1+
import { Body, Controller, DefaultValuePipe, Delete, Get, Post, Put, Param, ParseIntPipe, ParseFloatPipe, Query, Req } from '@nestjs/common';
22
import { Observable } from 'rxjs';
3-
import { Cookies } from '../cookies-decorator';
3+
import { Cookies, Headers } from '../decorators';
44
import { PetApi } from '../api';
55
import { ApiResponse, Pet, } from '../models';
66

samples/server/petstore/typescript-nestjs-server/builds/default/controllers/StoreApi.controller.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Body, Controller, Delete, Get, Post, Param, Query, Headers, Req } from '@nestjs/common';
1+
import { Body, Controller, DefaultValuePipe, Delete, Get, Post, Param, ParseIntPipe, ParseFloatPipe, Query, Req } from '@nestjs/common';
22
import { Observable } from 'rxjs';
3-
import { Cookies } from '../cookies-decorator';
3+
import { Cookies, Headers } from '../decorators';
44
import { StoreApi } from '../api';
55
import { Order, } from '../models';
66

samples/server/petstore/typescript-nestjs-server/builds/default/controllers/UserApi.controller.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Body, Controller, Delete, Get, Post, Put, Param, Query, Headers, Req } from '@nestjs/common';
1+
import { Body, Controller, DefaultValuePipe, Delete, Get, Post, Put, Param, ParseIntPipe, ParseFloatPipe, Query, Req } from '@nestjs/common';
22
import { Observable } from 'rxjs';
3-
import { Cookies } from '../cookies-decorator';
3+
import { Cookies, Headers } from '../decorators';
44
import { UserApi } from '../api';
55
import { User, } from '../models';
66

0 commit comments

Comments
 (0)