Skip to content

Commit

Permalink
support kebabcase request headers
Browse files Browse the repository at this point in the history
  • Loading branch information
spokli committed Jun 19, 2023
1 parent f606475 commit 53d3e98
Show file tree
Hide file tree
Showing 7 changed files with 108 additions and 19 deletions.
49 changes: 49 additions & 0 deletions examples/unified-api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ paths:
schema:
$ref: '#/components/schemas/OffsetRequest'
required: true
parameters:
- name: X-Sdk-Version
in: header
description: SDK version header
schema:
type: string
required: false
responses:
200:
description: OK; Offset has been scheduled correctly
Expand Down Expand Up @@ -172,6 +179,48 @@ paths:
- Playground Service
summary: Used to test st-open-api
operationId: playAround
parameters:
- name: X-Sdk-Version
in: header
description: SDK version header
schema:
type: string
required: true
- name: my-optional-header
in: header
description: test
schema:
type: string
required: false
- name: headerInCamelCase
in: header
description: test
schema:
type: string
required: false
- name: header_in_snake_case
in: header
description: test
schema:
type: string
required: true
- name: queryParameter
in: query
description: test
schema:
type: string
- name: pathParameter
in: path
description: test
schema:
type: string
required: true
- name: cookieParameter
in: cookie
description: test
schema:
type: string
required: true
responses:
200:
description: OK
Expand Down
13 changes: 10 additions & 3 deletions src/classes/object-property.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {UniqueArray} from "./unique-array";
import {splitByLineBreak} from "../function/split-by-line-break";
import {FolderManager} from "./folder-manager";
import {formatText} from "../function/formatText";
import { IHeaderParameter } from "../interface/i-header-parameter";

export const HTTP_FUNCTION_REF = (folder: FolderManager) => {
return {
Expand Down Expand Up @@ -109,7 +110,13 @@ export class ObjectProperty implements IPropertyClass {
queryParameterClassName: fun.queryParameters?.className,

isHeaderParameters: !!fun.headerParameters,
headerParameters: fun.headerParameters?.params,
headerParameters: fun.headerParameters && Object.values(fun.headerParameters.params).map(param => {
return {
name: param.name,
nameOriginal: param.nameOriginal,
required: param.required,
}
}),
headerParameterClassName: fun.headerParameters?.className,

isRequestBody: !!fun.requestBodyClass,
Expand Down Expand Up @@ -220,7 +227,7 @@ interface IMustacheFunction {

isHeaderParameters: boolean;
headerParameterClassName?: string;
headerParameters?: Array<string>;
headerParameters?: Array<{ name: string, nameOriginal: string, required: boolean }>;

isRequestBody: boolean;
requestBodyClass?: string;
Expand All @@ -243,7 +250,7 @@ export interface IFunction extends IFunctionResponse, IFunctionRequestBody {
};
headerParameters?: {
className: string;
params: Array<string>
params: { [parameterName: string]: IHeaderParameter }
};
queryParameters?: {
className: string;
Expand Down
26 changes: 17 additions & 9 deletions src/function/get-service-http-function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,20 @@ import {configuration} from "./config";
import {formatText} from "./formatText";
import {IParameter} from "../interface/open-api-mine/i-parameter";
import {IRefResult} from "../classes/ref";
import { IHeaderParameter } from "../interface/i-header-parameter";

type CreateParameterArguments =
{
type: 'query' | 'path' | 'cookie',
functionName: string,
parameters: { [parameterName: string]: IParameter }
} | {
type: 'header',
functionName: string,
parameters: { [parameterName: string]: IHeaderParameter }
}

const createParameter = (
type: 'query' | 'header' | 'path' | 'cookie',
functionName: string,
parameters: { [parameterName: string]: IParameter }
): IRefResult => {
const createParameter = ({type, functionName, parameters}: CreateParameterArguments): IRefResult => {
const parameterClassName = `I${functionName.substring(0, 1).toUpperCase()}${functionName.substring(1)}${type.substring(0, 1).toUpperCase()}${type.substring(1)}Parameter`;

const reference = configuration.getReference();
Expand Down Expand Up @@ -93,19 +101,19 @@ export const getServiceHttpFunction = (objProperty: ObjectProperty, httpMethod:
operationFunction.imports.push(response.import);

if (Object.keys(sortedParameter.query).length > 0) {
const {className, import: importString} = createParameter('query', functionName, sortedParameter.query)
const {className, import: importString} = createParameter({type: 'query', functionName, parameters: sortedParameter.query})
operationFunction.queryParameters = {className, params: Object.keys(sortedParameter.query)};
operationFunction.imports.push(importString);
}

if (Object.keys(sortedParameter.header).length > 0) {
const {className, import: importString} = createParameter('header', functionName, sortedParameter.header)
operationFunction.headerParameters = {className, params: Object.keys(sortedParameter.header)};
const {className, import: importString} = createParameter({type: 'header', functionName, parameters: sortedParameter.header})
operationFunction.headerParameters = {className, params: sortedParameter.header};
operationFunction.imports.push(importString);
}

if (Object.keys(sortedParameter.path).length > 0) {
const {className, import: importString} = createParameter('path', functionName, sortedParameter.path)
const {className, import: importString} = createParameter({type: 'path', functionName, parameters: sortedParameter.path})
operationFunction.pathParameters = {className, params: Object.keys(sortedParameter.path)};
operationFunction.imports.push(importString);
}
Expand Down
24 changes: 19 additions & 5 deletions src/function/get-sorted-parameter.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import {IParameter} from "../interface/open-api-mine/i-parameter";
import {ISortedParameter} from "../interface/i-sorted-parameter";
import { formatText } from "./formatText";
import { IHeaderParameter } from "../interface/i-header-parameter";

export const getSortedParameter = (path: string, parameters: Array<IParameter> = []): ISortedParameter => {

Expand All @@ -14,11 +16,23 @@ export const getSortedParameter = (path: string, parameters: Array<IParameter> =
const typedParam = parameter as IParameter;
const type = typedParam.in;

// no apply of 'authorization' header in each API endpoint;
// this shall be done in an interceptor
if (type === 'header' && typedParam.name === 'authorization') continue;

result[type][typedParam.name] = typedParam;
if (type === 'header') {
// no apply of 'authorization' header in each API endpoint;
// this shall be done in an interceptor
if (typedParam.name === 'authorization') {
continue;
}
const typedParamFormatted: IHeaderParameter = {
...typedParam,
name: formatText(typedParam.name, 'ANY', 'CamelCase'), // HTTP headers often use Upper-Kebab-Case
nameOriginal: typedParam.name
};
result[type][typedParam.name] = typedParamFormatted;
}

else {
result[type][typedParam.name] = typedParam;
}
}

return result
Expand Down
5 changes: 5 additions & 0 deletions src/interface/i-header-parameter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { IParameter } from "./open-api-mine/i-parameter";

export interface IHeaderParameter extends IParameter {
nameOriginal: string
}
3 changes: 2 additions & 1 deletion src/interface/i-sorted-parameter.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { IHeaderParameter } from "./i-header-parameter";
import {IParameter} from "./open-api-mine/i-parameter";

export interface ISortedParameter {
'query': { [parameterName: string]: IParameter }
'path': { [parameterName: string]: IParameter }
'cookie': { [parameterName: string]: IParameter }
'header': { [parameterName: string]: IParameter }
'header': { [parameterName: string]: IHeaderParameter }
}
7 changes: 6 additions & 1 deletion template/mustache/ts/function-class.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,12 @@
{{/isRequestBodyJson}}
{{#isHeaderParameters}}
{{#headerParameters}}
'{{.}}': headerParameter.{{.}},
{{#required}}
'{{nameOriginal}}': headerParameter.{{name}},
{{/required}}
{{^required}}
...(headerParameter.{{name}} && {['{{nameOriginal}}']: headerParameter.{{name}}}),
{{/required}}
{{/headerParameters}}
{{/isHeaderParameters}}
},
Expand Down

0 comments on commit 53d3e98

Please sign in to comment.