@izara_project/izara-core-generate-service-code 1.0.74 → 1.0.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/package.json +1 -1
  2. package/src/emit/crud/emitCrudApplicationArtifacts.js +2 -2
  3. package/src/emit/crud/emitDynamicCrudFlowSchemas.js +43 -2
  4. package/src/emit/crud/templates/CreateComplete_HdrSqs.ejs +99 -0
  5. package/src/emit/crud/templates/CreateComplete_Main.ejs +188 -0
  6. package/src/emit/crud/templates/DeleteComplete_HdrSqs.ejs +99 -0
  7. package/src/emit/crud/templates/DeleteComplete_Main.ejs +188 -0
  8. package/src/emit/crud/templates/FlowEndpointComplete_Main.ejs +1 -1
  9. package/src/emit/crud/templates/UpdateComplete_HdrSqs.ejs +99 -0
  10. package/src/emit/crud/templates/UpdateComplete_Main.ejs +188 -0
  11. package/src/emit/custom/customFlows.js +15 -1
  12. package/src/emit/custom/emitCustomFlowApplicationArtifacts.js +2 -0
  13. package/src/emit/custom/templates/FlowEndpoint_Main.ejs +1 -1
  14. package/src/emit/relationship/emitDynamicRelationshipFlowSchemas.js +21 -1
  15. package/src/emit/relationship/emitRelationshipApplicationArtifacts.js +1 -1
  16. package/src/emit/relationship/templates/ChangeRelationshipComplete_HdrSqs.ejs +99 -0
  17. package/src/emit/relationship/templates/ChangeRelationshipComplete_Main.ejs +91 -87
  18. package/src/emit/relationship/templates/CreateRelationshipComplete_HdrSqs.ejs +99 -0
  19. package/src/emit/relationship/templates/CreateRelationshipComplete_Main.ejs +90 -86
  20. package/src/emit/relationship/templates/DeleteRelationshipComplete_HdrSqs.ejs +99 -0
  21. package/src/emit/relationship/templates/DeleteRelationshipComplete_Main.ejs +85 -81
  22. package/src/emit/relationship/templates/GetRelationshipComplete_HdrSqs.ejs +99 -0
  23. package/src/emit/relationship/templates/GetRelationshipComplete_Main.ejs +2 -0
  24. package/src/emit/relationship/templates/GetRelationship_Main.ejs +2 -20
  25. package/src/emit/relationship/templates/MoveRelationshipComplete_HdrSqs.ejs +99 -0
  26. package/src/emit/relationship/templates/MoveRelationshipComplete_Main.ejs +93 -89
  27. package/src/emit/relationship/templates/UpdateRelationshipComplete_HdrSqs.ejs +99 -0
  28. package/src/emit/relationship/templates/UpdateRelationshipComplete_Main.ejs +85 -81
  29. package/src/emit/resource/emitResourceArtifacts.js +23 -0
  30. package/src/emit/shared/templates/FindData_Main.ejs +1 -1
  31. package/src/emit/system/emitSystemWebSocketArtifacts.js +54 -2
  32. package/src/emit/system/templates/RegisterComplete_HdrSqs.ejs +64 -0
  33. package/src/emit/system/templates/RegisterComplete_Main.ejs +154 -0
  34. package/src/emit/system/templates/RegisterComplete_Yaml.ejs +17 -0
  35. package/src/emit/system/templates/RegisterWbs_Yaml.ejs +7 -0
  36. package/src/emit/system/templates/Register_HdrWbs.ejs +56 -0
  37. package/src/emit/system/templates/Register_Main.ejs +148 -0
  38. package/test/customFlowApplicationArtifacts.test.js +16 -5
  39. package/test/publicApi.test.js +21 -0
  40. package/test/relationshipApplicationArtifacts.test.js +1 -1
  41. package/test/resourceArtifacts.test.js +20 -0
@@ -0,0 +1,7 @@
1
+ RegisterWbs:
2
+ handler: src/generatedCode/SystemFlowSchemas/Register/source/Register_HdrWbs.main
3
+ name: ${self:custom.iz_resourcePrefix}RegisterWbs
4
+ role: RegisterRole
5
+ events:
6
+ - websocket:
7
+ route: register
@@ -0,0 +1,56 @@
1
+ import { middlewareHandler as middleware, consts, response } from '@izara_project/izara-middleware';
2
+ import callingFlowSharedLib from '@izara_project/izara-core-library-calling-flow';
3
+ import registerMain from './Register_Main.js';
4
+ import dynamodbSharedLib from '@izara_project/izara-core-library-dynamodb';
5
+ import { webSocket } from '@izara_project/izara-core-library-external-request';
6
+ const { postToConnection } = webSocket;
7
+
8
+ export const main = middleware.wrap(async (event, context) => {
9
+ event._izContext.logger.debug('Event:', event);
10
+
11
+ try {
12
+ if (event.requestContext) {
13
+ const route = event.requestContext.routeKey;
14
+ const connectionId = event.requestContext.connectionId;
15
+ let correlationId = event._izContext.correlationIds.get(consts.X_CORRELATION_ID);
16
+
17
+ switch (route) {
18
+ case '$default':
19
+ console.log('Received unknown route:', route);
20
+ break;
21
+ case 'register':
22
+ console.log('event in route register', event);
23
+ let eventParams = JSON.parse(event.body);
24
+
25
+ await dynamodbSharedLib.putItem(
26
+ event._izContext,
27
+ await dynamodbSharedLib.tableName(event._izContext, 'WebSocketTask'),
28
+ {
29
+ taskKey: correlationId,
30
+ connectionId: connectionId
31
+ }
32
+ );
33
+
34
+ let callingFlow = eventParams?.callingFlow ? eventParams.callingFlow : {};
35
+
36
+ await registerMain(
37
+ event._izContext,
38
+ eventParams,
39
+ callingFlowSharedLib.addCallingFlowToPassOnProperties(callingFlow)
40
+ );
41
+ break;
42
+ }
43
+ } else {
44
+ const connId = event.connId;
45
+ await postToConnection({ message: event.message }, connId);
46
+ }
47
+ return response.webSocketSuccess();
48
+ } catch (err) {
49
+ const connId = event.requestContext?.connectionId;
50
+ event._izContext.logger.error('Error, WebSocket: ', err);
51
+ if (connId) {
52
+ await postToConnection({ message: err.message }, connId);
53
+ }
54
+ return response.failure(err);
55
+ }
56
+ });
@@ -0,0 +1,148 @@
1
+ import { objectHash as hash } from '@izara_project/izara-shared-core';
2
+ import { getObjectSchema, identifiersObject } from '@izara_project/izara-core-library-service-schemas';
3
+ import dynamodbSharedLib from '@izara_project/izara-core-library-dynamodb';
4
+ import lambdaSharedLib from '@izara_project/izara-core-library-lambda';
5
+ import { lambda, webSocket } from '@izara_project/izara-core-library-external-request';
6
+ import { NoRetryError } from '@izara_project/izara-core-library-core';
7
+ import { consts } from '@izara_project/izara-middleware';
8
+ const { postToConnection } = webSocket;
9
+
10
+ /**
11
+ * Register main handler
12
+ * @param {Object} _izContext
13
+ * @param {Object} requestParams
14
+ * @param {Object} callingFlowConfig
15
+ */
16
+ export default async function registerMain(
17
+ _izContext,
18
+ requestParams,
19
+ callingFlowConfig = {}
20
+ ) {
21
+ try {
22
+ let connectionId = _izContext.correlationIds.get(consts.CONNECTION_ID);
23
+ let flowSchema = await getObjectSchema.getFlowSchemaS3WithCache(_izContext, {
24
+ flowTag: requestParams.flowTag,
25
+ serviceTag: process.env.iz_serviceTag
26
+ });
27
+
28
+ _izContext.logger.debug('flowSchema', flowSchema);
29
+ if (!flowSchema) {
30
+ throw new NoRetryError(`flowTag not found ${requestParams.flowTag}`);
31
+ }
32
+
33
+ const getResult = async (objType) => {
34
+ const objectSchema = await getObjectSchema.getObjSchemaS3WithCache(
35
+ _izContext,
36
+ {
37
+ objectType: objType.objectType,
38
+ serviceTag: objType.serviceTag
39
+ }
40
+ );
41
+
42
+ _izContext.logger.debug('==> objectSchema', objectSchema);
43
+
44
+ const result = await lambda.invokeSync(
45
+ _izContext,
46
+ await lambdaSharedLib.lambdaFunctionName(_izContext, 'GetHdrInv'),
47
+ {
48
+ identifiers: await identifiersObject.identifiersFromIdentifiersConcat(
49
+ _izContext,
50
+ objType,
51
+ requestParams.identifiersTask
52
+ ),
53
+ objectType: objType.objectType
54
+ }
55
+ );
56
+
57
+ if (!result) {
58
+ await postToConnection({ message: 'not have record' }, connectionId);
59
+ } else {
60
+ for (const [fieldName, fieldNameSetting] of Object.entries(
61
+ objectSchema.fieldNames
62
+ )) {
63
+ if (
64
+ fieldNameSetting.hasOwnProperty('statusField') &&
65
+ fieldNameSetting.statusField === true
66
+ ) {
67
+ if (
68
+ result.fields[fieldName] !== 'complete' &&
69
+ result.fields[fieldName] !== 'error'
70
+ ) {
71
+ await dynamodbSharedLib.putItem(
72
+ _izContext,
73
+ await dynamodbSharedLib.tableName(_izContext, 'RegisterRecords'),
74
+ {
75
+ identifiersTask: requestParams.identifiersTask,
76
+ connectionId: connectionId
77
+ }
78
+ );
79
+ } else {
80
+ await postToConnection({ message: result }, connectionId);
81
+ }
82
+ }
83
+ }
84
+ }
85
+ };
86
+
87
+ switch (flowSchema.statusType) {
88
+ case 'statusField':
89
+ await getResult(flowSchema.objType);
90
+ break;
91
+ case 'storedCache':
92
+ await getResult(flowSchema.objType);
93
+ break;
94
+ case 'triggerCache':
95
+ await getResult(flowSchema.objType);
96
+ break;
97
+ case 'none': {
98
+ let identifier = {};
99
+ if (
100
+ requestParams.hasOwnProperty('identifiersField') &&
101
+ Array.isArray(requestParams.identifiersField)
102
+ ) {
103
+ for (const fieldNames of requestParams.identifiersField) {
104
+ Object.assign(identifier, {
105
+ [fieldNames]: requestParams[fieldNames]
106
+ });
107
+ }
108
+ } else {
109
+ let pureRequestParams = structuredClone(requestParams);
110
+ delete pureRequestParams.flowTag;
111
+ identifier = pureRequestParams;
112
+ }
113
+
114
+ let tasks = await dynamodbSharedLib.query(
115
+ _izContext,
116
+ await dynamodbSharedLib.tableName(_izContext, 'RegisterRecords'),
117
+ {
118
+ identifiersTask: hash(identifier)
119
+ }
120
+ );
121
+ if (tasks.Items && tasks.Items.length > 0) {
122
+ await Promise.all(
123
+ tasks.Items.map(async (task) => {
124
+ await postToConnection({ message: task }, task.connectionId);
125
+ })
126
+ );
127
+ await postToConnection({ message: tasks.Items[0] }, connectionId);
128
+ return tasks.Items[0];
129
+ } else {
130
+ await dynamodbSharedLib.putItem(
131
+ _izContext,
132
+ await dynamodbSharedLib.tableName(_izContext, 'RegisterRecords'),
133
+ {
134
+ identifiersTask: hash(identifier),
135
+ connectionId: connectionId
136
+ }
137
+ );
138
+ }
139
+ break;
140
+ }
141
+ default:
142
+ throw new NoRetryError(`statusType not found ${flowSchema.statusType}`);
143
+ }
144
+ } catch (err) {
145
+ _izContext.logger.error('error WebSocketInvoke: ', err);
146
+ throw err;
147
+ }
148
+ }
@@ -36,7 +36,17 @@ test('emits handlers, function YAML, and IAM roles for supported custom flow eve
36
36
  const result = await generateCustomFlowApplicationArtifacts(rootPath);
37
37
  await generateResourceArtifacts(rootPath);
38
38
 
39
- assert.equal(result.files.length, 38);
39
+ assert.equal(result.files.length, 43);
40
+ assert.match(
41
+ await readFile(
42
+ join(
43
+ rootPath,
44
+ 'app/src/generatedCode/SystemFlowSchemas/Register/source/Register_Main.js'
45
+ ),
46
+ 'utf8'
47
+ ),
48
+ /registerMain/
49
+ );
40
50
  assert.match(
41
51
  await readFile(
42
52
  join(
@@ -794,17 +804,18 @@ test('renders nextSteps IAM permissions in InitialSetupConfig', async () => {
794
804
  ),
795
805
  'utf8'
796
806
  );
797
- assert.match(initialSetupConfigContent, /roleName: 'ReservationsRole'/);
807
+ assert.match(initialSetupConfigContent, /roleName: 'Reservations'/);
798
808
  assert.match(
799
809
  initialSetupConfigContent,
800
- /ReservationsRolePublishNextStepsTopics/
810
+ /ReservationsPublishNextStepsTopics/
801
811
  );
802
812
  assert.match(
803
813
  initialSetupConfigContent,
804
- /snsTopicNameByFlowSchema\(_izContext, 'GetDeepPathSearch_In', 'GraphHandler'\)/
814
+ /\/\/\(<createReservationsRole>\)/
805
815
  );
806
816
  assert.match(
807
817
  initialSetupConfigContent,
808
- /snsTopicNameByFlowSchema\(\s*_izContext,\s*'Create_In'\)/
818
+ /\/\/\(<\/createReservationsRole>\)/
809
819
  );
810
820
  });
821
+
@@ -99,6 +99,27 @@ test('generate commits the system WebSocket completion path for own-topic flows'
99
99
  'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js'
100
100
  )
101
101
  );
102
+ assert.ok(
103
+ result.files.some(
104
+ (file) =>
105
+ file.path ===
106
+ 'app/src/generatedCode/SystemFlowSchemas/Register/source/Register_Main.js'
107
+ )
108
+ );
109
+ assert.ok(
110
+ result.files.some(
111
+ (file) =>
112
+ file.path ===
113
+ 'app/src/generatedCode/SystemFlowSchemas/Register/source/Register_HdrWbs.js'
114
+ )
115
+ );
116
+ assert.ok(
117
+ result.files.some(
118
+ (file) =>
119
+ file.path ===
120
+ 'app/src/generatedCode/SystemFlowSchemas/Register/source/RegisterComplete_Main.js'
121
+ )
122
+ );
102
123
  assert.ok(
103
124
  result.files.some(
104
125
  (file) =>
@@ -115,7 +115,7 @@ test('emits relationship action and complete handlers with data-first function Y
115
115
  );
116
116
  assert.match(
117
117
  createCompleteContent,
118
- /const {\s*returnValue,\s*status,\s*errorsFound,\s*graphServiceTag\s*} = requestParams;/
118
+ /const {\s*returnValue,\s*parentFlowId,\s*status,\s*errorsFound,\s*graphServiceTag\s*} = requestParams;/
119
119
  );
120
120
  assert.doesNotMatch(
121
121
  createCompleteContent,
@@ -237,6 +237,26 @@ test('emits DynamoDB tables and hooks defined in flowSchemas storageResources',
237
237
  assert.match(dynamoYaml, /#<#\/FlowCustomTableTableSetting#>/);
238
238
  });
239
239
 
240
+ test('emits IAM role for generated DSQ flows in generate-shared-resource.yml', async () => {
241
+ const rootPath = await createProject();
242
+ const schemas = join(rootPath, 'app/src/schemas');
243
+ await writeFile(
244
+ join(schemas, 'FlowSchemas/GeneratedDsq.js'),
245
+ "export default { flowTag: 'generatedDsq', generatedCodeConfig: {}, event: ['dsq'] };\n"
246
+ );
247
+ await generateResourceArtifacts(rootPath);
248
+
249
+ const iam = await readFile(
250
+ join(
251
+ rootPath,
252
+ 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'
253
+ ),
254
+ 'utf8'
255
+ );
256
+ const role = roleBlock(iam, 'GeneratedDsqRole');
257
+ assert.match(role, /GeneratedDsqHdrDsq/);
258
+ });
259
+
240
260
  function roleBlock(iam, roleName) {
241
261
  const match = iam.match(
242
262
  new RegExp(