-
Notifications
You must be signed in to change notification settings - Fork 57
/
Copy pathaction-import.ts
114 lines (103 loc) · 3.38 KB
/
action-import.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { createLogger } from '@sap-cloud-sdk/util';
import { ServiceNameFormatter } from '../../service-name-formatter';
import { swaggerDefinitionForFunctionImport } from '../../swagger-parser/swagger-parser';
import {
EdmxAction,
EdmxActionImport,
parseActionImport,
parseActions
} from '../../edmx-parser/v4';
import { ServiceMetadata } from '../../edmx-parser/edmx-file-reader';
import { VdmActionImport, VdmComplexType, VdmEntity } from '../../vdm-types';
import { parseActionImportReturnTypes } from '../common/action-function-return-types';
import { transformActionImportBase } from '../common/action-import';
import { hasUnsupportedParameterTypes } from '../edmx-to-vdm-util';
import { findActionFunctionByImportName } from './action-function-util';
const logger = createLogger({
package: 'generator',
messageContext: 'action-import'
});
function findActionForActionImport(
actions: EdmxAction[],
actionImport: EdmxActionImport
): EdmxAction | undefined {
return findActionFunctionByImportName(actions, actionImport.Action);
}
const extractResponse = (response: string) => `${response}.value`;
interface JoinedActionImportData {
actionImport: EdmxActionImport;
action: EdmxAction;
}
function joinActionImportData(
actionImports: EdmxActionImport[],
actions: EdmxAction[]
): JoinedActionImportData[] {
const actionImportsWithoutActions: EdmxActionImport[] = [];
const joinedActionImportData = actionImports.reduce(
(joined, actionImport) => {
const edmxAction = findActionForActionImport(actions, actionImport);
if (edmxAction) {
return [
...joined,
{
actionImport,
action: edmxAction
}
];
}
actionImportsWithoutActions.push(actionImport);
return joined;
},
[]
);
if (actionImportsWithoutActions) {
logger.warn(
`Could not find actions referenced by the following action imports. Skipping code generation:
${actionImportsWithoutActions
.map(f => `${f.Name} => ${f.Action}`)
.join(', \n')}`
);
}
return joinedActionImportData;
}
export function generateActionImportsV4(
serviceMetadata: ServiceMetadata,
entities: VdmEntity[],
complexTypes: Omit<VdmComplexType, 'factoryName'>[],
formatter: ServiceNameFormatter
): VdmActionImport[] {
const actions = parseActions(serviceMetadata.edmx.root);
const actionImports = parseActionImport(serviceMetadata.edmx.root);
const joinedFunctionData = joinActionImportData(actionImports, actions);
return (
joinedFunctionData
// TODO 1571 remove when supporting entity type as parameter
.filter(
({ action: edmxAction }) => !hasUnsupportedParameterTypes(edmxAction)
)
.map(({ actionImport, action: edmxAction }) => {
const httpMethod = 'post';
const swaggerDefinition = swaggerDefinitionForFunctionImport(
actionImport.Name,
httpMethod,
serviceMetadata.swagger
);
return {
...transformActionImportBase(
actionImport,
edmxAction.Parameter || [],
swaggerDefinition,
formatter
),
httpMethod,
returnType: parseActionImportReturnTypes(
edmxAction.ReturnType?.Type,
entities,
complexTypes,
extractResponse,
serviceMetadata.edmx.oDataVersion
)
};
})
);
}