@finos/legend-extension-dsl-data-space 10.2.0 → 10.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. package/lib/__lib__/query/DSL_DataSpace_LegendQueryNavigation.d.ts +18 -6
  2. package/lib/__lib__/query/DSL_DataSpace_LegendQueryNavigation.d.ts.map +1 -1
  3. package/lib/__lib__/query/DSL_DataSpace_LegendQueryNavigation.js +18 -6
  4. package/lib/__lib__/query/DSL_DataSpace_LegendQueryNavigation.js.map +1 -1
  5. package/lib/components/DSL_DataSpace_LegendApplicationPlugin.d.ts.map +1 -1
  6. package/lib/components/DSL_DataSpace_LegendApplicationPlugin.js +1 -0
  7. package/lib/components/DSL_DataSpace_LegendApplicationPlugin.js.map +1 -1
  8. package/lib/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.d.ts +4 -1
  9. package/lib/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.d.ts.map +1 -1
  10. package/lib/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.js +55 -5
  11. package/lib/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.js.map +1 -1
  12. package/lib/components/query/DataSpaceQueryBuilderTemplateQueryPanelContent.js +1 -1
  13. package/lib/components/query/DataSpaceQueryBuilderTemplateQueryPanelContent.js.map +1 -1
  14. package/lib/components/query/DataSpaceTemplateQueryCreator.js +4 -4
  15. package/lib/components/query/DataSpaceTemplateQueryCreator.js.map +1 -1
  16. package/lib/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.d.ts +2 -0
  17. package/lib/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.d.ts.map +1 -1
  18. package/lib/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.js +13 -0
  19. package/lib/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.js.map +1 -1
  20. package/lib/components/studio/DataSpaceTemplateQueryPromoteReview.d.ts +19 -0
  21. package/lib/components/studio/DataSpaceTemplateQueryPromoteReview.d.ts.map +1 -0
  22. package/lib/components/studio/DataSpaceTemplateQueryPromoteReview.js +79 -0
  23. package/lib/components/studio/DataSpaceTemplateQueryPromoteReview.js.map +1 -0
  24. package/lib/graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.d.ts +1 -0
  25. package/lib/graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.d.ts.map +1 -1
  26. package/lib/graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.js +2 -0
  27. package/lib/graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.js.map +1 -1
  28. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.d.ts +1 -0
  29. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.d.ts.map +1 -1
  30. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.js +1 -0
  31. package/lib/graph-manager/action/analytics/DataSpaceAnalysis.js.map +1 -1
  32. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.d.ts +10 -1
  33. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.d.ts.map +1 -1
  34. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.js.map +1 -1
  35. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureProtocolProcessorPlugin.d.ts.map +1 -1
  36. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureProtocolProcessorPlugin.js +2 -0
  37. package/lib/graph-manager/protocol/pure/DSL_DataSpace_PureProtocolProcessorPlugin.js.map +1 -1
  38. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.d.ts +12 -1
  39. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.d.ts.map +1 -1
  40. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.js +28 -3
  41. package/lib/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.js.map +1 -1
  42. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.d.ts +1 -0
  43. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.d.ts.map +1 -1
  44. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.js +2 -0
  45. package/lib/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.js.map +1 -1
  46. package/lib/graph-manager/protocol/pure/v1/model/packageableElements/dataSpace/V1_DSL_DataSpace_DataSpace.d.ts +1 -0
  47. package/lib/graph-manager/protocol/pure/v1/model/packageableElements/dataSpace/V1_DSL_DataSpace_DataSpace.d.ts.map +1 -1
  48. package/lib/graph-manager/protocol/pure/v1/model/packageableElements/dataSpace/V1_DSL_DataSpace_DataSpace.js +2 -0
  49. package/lib/graph-manager/protocol/pure/v1/model/packageableElements/dataSpace/V1_DSL_DataSpace_DataSpace.js.map +1 -1
  50. package/lib/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataSpace_ProtocolHelper.d.ts.map +1 -1
  51. package/lib/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataSpace_ProtocolHelper.js +1 -0
  52. package/lib/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataSpace_ProtocolHelper.js.map +1 -1
  53. package/lib/index.css +2 -2
  54. package/lib/index.css.map +1 -1
  55. package/lib/package.json +2 -1
  56. package/lib/stores/query/DataSpaceTemplateQueryCreatorStore.d.ts +3 -2
  57. package/lib/stores/query/DataSpaceTemplateQueryCreatorStore.d.ts.map +1 -1
  58. package/lib/stores/query/DataSpaceTemplateQueryCreatorStore.js +9 -13
  59. package/lib/stores/query/DataSpaceTemplateQueryCreatorStore.js.map +1 -1
  60. package/lib/stores/query/DataSpaceTemplateQueryPromotionReviewerStore.d.ts +61 -0
  61. package/lib/stores/query/DataSpaceTemplateQueryPromotionReviewerStore.d.ts.map +1 -0
  62. package/lib/stores/query/DataSpaceTemplateQueryPromotionReviewerStore.js +407 -0
  63. package/lib/stores/query/DataSpaceTemplateQueryPromotionReviewerStore.js.map +1 -0
  64. package/package.json +8 -7
  65. package/src/__lib__/query/DSL_DataSpace_LegendQueryNavigation.ts +43 -9
  66. package/src/components/DSL_DataSpace_LegendApplicationPlugin.tsx +1 -0
  67. package/src/components/query/DSL_DataSpace_LegendQueryApplicationPlugin.tsx +117 -3
  68. package/src/components/query/DataSpaceQueryBuilderTemplateQueryPanelContent.tsx +1 -1
  69. package/src/components/query/DataSpaceTemplateQueryCreator.tsx +6 -6
  70. package/src/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.tsx +18 -1
  71. package/src/components/studio/DataSpaceTemplateQueryPromoteReview.tsx +285 -0
  72. package/src/graph/metamodel/pure/model/packageableElements/dataSpace/DSL_DataSpace_DataSpace.ts +2 -0
  73. package/src/graph-manager/action/analytics/DataSpaceAnalysis.ts +1 -0
  74. package/src/graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.ts +15 -0
  75. package/src/graph-manager/protocol/pure/DSL_DataSpace_PureProtocolProcessorPlugin.ts +2 -0
  76. package/src/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_PureGraphManagerExtension.ts +66 -2
  77. package/src/graph-manager/protocol/pure/v1/engine/analytics/V1_DataSpaceAnalysis.ts +2 -0
  78. package/src/graph-manager/protocol/pure/v1/model/packageableElements/dataSpace/V1_DSL_DataSpace_DataSpace.ts +2 -0
  79. package/src/graph-manager/protocol/pure/v1/transformation/pureProtocol/V1_DSL_DataSpace_ProtocolHelper.ts +1 -0
  80. package/src/stores/query/DataSpaceTemplateQueryCreatorStore.ts +12 -24
  81. package/src/stores/query/DataSpaceTemplateQueryPromotionReviewerStore.ts +636 -0
  82. package/tsconfig.json +2 -0
@@ -0,0 +1,636 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ type LightQuery,
19
+ type QueryInfo,
20
+ type RawLambda,
21
+ GraphManagerState,
22
+ } from '@finos/legend-graph';
23
+ import {
24
+ type DepotServerClient,
25
+ StoreProjectData,
26
+ ProjectDependencyCoordinates,
27
+ ProjectVersionEntities,
28
+ } from '@finos/legend-server-depot';
29
+ import {
30
+ ActionState,
31
+ assertErrorThrown,
32
+ guaranteeNonNullable,
33
+ LogEvent,
34
+ type GeneratorFn,
35
+ type PlainObject,
36
+ } from '@finos/legend-shared';
37
+ import {
38
+ generateDataSpaceQuerySetupRoute,
39
+ generateDataSpaceTemplateQueryPromotionRoute,
40
+ } from '../../__lib__/query/DSL_DataSpace_LegendQueryNavigation.js';
41
+ import { type Entity } from '@finos/legend-storage';
42
+ import {
43
+ type ProjectConfigurationStatus,
44
+ fetchProjectConfigurationStatus,
45
+ generateEditorRoute,
46
+ LEGEND_STUDIO_APP_EVENT,
47
+ type LegendStudioApplicationStore,
48
+ EditorStore,
49
+ generateReviewRoute,
50
+ } from '@finos/legend-application-studio';
51
+ import {
52
+ DEFAULT_TAB_SIZE,
53
+ ActionAlertType,
54
+ ActionAlertActionType,
55
+ } from '@finos/legend-application';
56
+ import {
57
+ makeObservable,
58
+ observable,
59
+ computed,
60
+ action,
61
+ flow,
62
+ flowResult,
63
+ } from 'mobx';
64
+ import {
65
+ type SDLCServerClient,
66
+ type ProjectDependency,
67
+ Project,
68
+ WorkspaceType,
69
+ Workspace,
70
+ ProjectConfiguration,
71
+ EntityChangeType,
72
+ } from '@finos/legend-server-sdlc';
73
+ import {
74
+ type DSL_DataSpace_PureGraphManagerExtension,
75
+ DSL_DataSpace_getGraphManagerExtension,
76
+ } from '../../graph-manager/protocol/pure/DSL_DataSpace_PureGraphManagerExtension.js';
77
+ import { DATA_SPACE_ELEMENT_CLASSIFIER_PATH } from '../../graph-manager/protocol/pure/DSL_DataSpace_PureProtocolProcessorPlugin.js';
78
+
79
+ const projectDependencyToProjectCoordinates = (
80
+ projectDependency: ProjectDependency,
81
+ ): ProjectDependencyCoordinates =>
82
+ new ProjectDependencyCoordinates(
83
+ guaranteeNonNullable(projectDependency.groupId),
84
+ guaranteeNonNullable(projectDependency.artifactId),
85
+ projectDependency.versionId,
86
+ );
87
+
88
+ const DEFAULT_WORKSPACE_NAME_PREFIX = 'promote-as-template-query';
89
+
90
+ export class DataSpaceTemplateQueryPromotionReviewerStore {
91
+ readonly applicationStore: LegendStudioApplicationStore;
92
+ readonly sdlcServerClient: SDLCServerClient;
93
+ readonly depotServerClient: DepotServerClient;
94
+ readonly graphManagerState: GraphManagerState;
95
+ readonly initState = ActionState.create();
96
+ readonly promoteState = ActionState.create();
97
+ readonly loadQueryState = ActionState.create();
98
+ readonly loadWorkspacesState = ActionState.create();
99
+ editorStore: EditorStore;
100
+ graphManagerExtension: DSL_DataSpace_PureGraphManagerExtension;
101
+ currentQuery?: LightQuery | undefined;
102
+ currentQueryInfo?: QueryInfo | undefined;
103
+ currentQueryProject?: StoreProjectData | undefined;
104
+ currentProject?: Project | undefined;
105
+ currentProjectConfiguration?: ProjectConfiguration;
106
+ currentProjectConfigurationStatus?: ProjectConfigurationStatus | undefined;
107
+ currentProjectEntities: Entity[] = [];
108
+ dependencyEntities: Entity[] = [];
109
+ groupWorkspaces: Workspace[] = [];
110
+ workspaceName = '';
111
+ dataSpacePath!: string;
112
+ dataSpaceEntity: Entity | undefined;
113
+ templateQueryId = 'template_id';
114
+ templateQueryTitle = 'template_title';
115
+ templateQueryDescription = '';
116
+
117
+ constructor(
118
+ applicationStore: LegendStudioApplicationStore,
119
+ sdlcServerClient: SDLCServerClient,
120
+ depotServerClient: DepotServerClient,
121
+ ) {
122
+ makeObservable(this, {
123
+ editorStore: observable,
124
+ graphManagerExtension: observable,
125
+ currentQuery: observable,
126
+ currentQueryInfo: observable,
127
+ currentQueryProject: observable,
128
+ currentProject: observable,
129
+ currentProjectConfiguration: observable,
130
+ currentProjectConfigurationStatus: observable,
131
+ currentProjectEntities: observable,
132
+ dataSpaceEntity: observable,
133
+ groupWorkspaces: observable,
134
+ workspaceName: observable,
135
+ templateQueryId: observable,
136
+ templateQueryTitle: observable,
137
+ templateQueryDescription: observable,
138
+ isWorkspaceNameValid: computed,
139
+ isTemplateQueryIdValid: computed,
140
+ setWorkspaceName: action,
141
+ setTemplateQueryId: action,
142
+ setTemplateQueryTitle: action,
143
+ setTemplateQueryDescription: action,
144
+ initialize: flow,
145
+ loadQuery: flow,
146
+ loadProject: flow,
147
+ promoteAsTemplateQuery: flow,
148
+ });
149
+
150
+ this.applicationStore = applicationStore;
151
+ this.sdlcServerClient = sdlcServerClient;
152
+ this.depotServerClient = depotServerClient;
153
+ this.graphManagerState = new GraphManagerState(
154
+ applicationStore.pluginManager,
155
+ applicationStore.logService,
156
+ );
157
+ this.editorStore = new EditorStore(
158
+ applicationStore,
159
+ sdlcServerClient,
160
+ depotServerClient,
161
+ );
162
+ this.graphManagerExtension = DSL_DataSpace_getGraphManagerExtension(
163
+ this.editorStore.graphManagerState.graphManager,
164
+ );
165
+ }
166
+
167
+ setWorkspaceName(val: string): void {
168
+ this.workspaceName = val;
169
+ }
170
+
171
+ setTemplateQueryId(val: string): void {
172
+ this.templateQueryId = val;
173
+ }
174
+
175
+ setTemplateQueryTitle(val: string): void {
176
+ this.templateQueryTitle = val;
177
+ }
178
+
179
+ setTemplateQueryDescription(val: string): void {
180
+ this.templateQueryDescription = val;
181
+ }
182
+
183
+ get isWorkspaceNameValid(): boolean {
184
+ return !this.groupWorkspaces.some(
185
+ (ws) => ws.workspaceId === this.workspaceName,
186
+ );
187
+ }
188
+
189
+ get isTemplateQueryIdValid(): boolean {
190
+ if (this.dataSpaceEntity) {
191
+ return this.graphManagerExtension.IsTemplateQueryIdValid(
192
+ this.dataSpaceEntity,
193
+ this.templateQueryId,
194
+ );
195
+ }
196
+ return false;
197
+ }
198
+
199
+ *initialize(
200
+ queryId: string | undefined,
201
+ dataSpacePath: string,
202
+ ): GeneratorFn<void> {
203
+ if (!this.initState.isInInitialState) {
204
+ return;
205
+ }
206
+ try {
207
+ this.initState.inProgress();
208
+ yield this.graphManagerState.graphManager.initialize(
209
+ {
210
+ env: this.applicationStore.config.env,
211
+ tabSize: DEFAULT_TAB_SIZE,
212
+ clientConfig: {
213
+ baseUrl: this.applicationStore.config.engineServerUrl,
214
+ queryBaseUrl: this.applicationStore.config.engineQueryServerUrl,
215
+ enableCompression: true,
216
+ },
217
+ },
218
+ {
219
+ tracerService: this.applicationStore.tracerService,
220
+ },
221
+ );
222
+ this.dataSpacePath = dataSpacePath;
223
+ if (queryId) {
224
+ let query: LightQuery | undefined;
225
+ try {
226
+ query = (yield this.graphManagerState.graphManager.getLightQuery(
227
+ queryId,
228
+ )) as LightQuery;
229
+ } catch {
230
+ query = undefined;
231
+ }
232
+ if (query) {
233
+ yield flowResult(this.loadQuery(query));
234
+ } else {
235
+ this.applicationStore.navigationService.navigator.updateCurrentLocation(
236
+ generateDataSpaceQuerySetupRoute(),
237
+ );
238
+ }
239
+ }
240
+ if (this.currentQuery) {
241
+ this.currentQueryProject = StoreProjectData.serialization.fromJson(
242
+ (yield this.depotServerClient.getProject(
243
+ this.currentQuery.groupId,
244
+ this.currentQuery.artifactId,
245
+ )) as PlainObject<StoreProjectData>,
246
+ );
247
+ const projectData = (yield Promise.all([
248
+ this.depotServerClient.getVersionEntities(
249
+ this.currentQuery.groupId,
250
+ this.currentQuery.artifactId,
251
+ this.currentQuery.versionId,
252
+ ),
253
+ this.sdlcServerClient.getConfiguration(
254
+ this.currentQueryProject.projectId,
255
+ undefined,
256
+ ),
257
+ ])) as [Entity[], PlainObject<ProjectConfiguration>];
258
+
259
+ const [currentProjectEntities, currentProjectConfiguration] = [
260
+ projectData[0],
261
+ ProjectConfiguration.serialization.fromJson(projectData[1]),
262
+ ];
263
+ this.currentProjectConfiguration = currentProjectConfiguration;
264
+ const dependencyEntities = (
265
+ (yield this.depotServerClient.collectDependencyEntities(
266
+ (
267
+ [
268
+ ...currentProjectConfiguration.projectDependencies,
269
+ ] as ProjectDependency[]
270
+ )
271
+ .map(projectDependencyToProjectCoordinates)
272
+ .map((p) => ProjectDependencyCoordinates.serialization.toJson(p)),
273
+ true,
274
+ true,
275
+ )) as PlainObject<ProjectVersionEntities>[]
276
+ )
277
+ .map((p) => ProjectVersionEntities.serialization.fromJson(p))
278
+ .flatMap((info) => info.entities);
279
+ this.dependencyEntities = dependencyEntities;
280
+ this.currentProjectEntities = currentProjectEntities;
281
+ this.dataSpaceEntity = guaranteeNonNullable(
282
+ currentProjectEntities.filter(
283
+ (entity: Entity) =>
284
+ entity.path === dataSpacePath &&
285
+ entity.classifierPath === DATA_SPACE_ELEMENT_CLASSIFIER_PATH,
286
+ )[0],
287
+ `Can't find dataSpace entity with path ${this.dataSpaceEntity}`,
288
+ );
289
+ this.initState.pass();
290
+ }
291
+ } catch (error) {
292
+ assertErrorThrown(error);
293
+ this.applicationStore.logService.error(
294
+ LogEvent.create(LEGEND_STUDIO_APP_EVENT.GENERIC_FAILURE),
295
+ error,
296
+ );
297
+ this.applicationStore.alertService.setBlockingAlert({
298
+ message: `Can't initialize template query promotion reviewer store`,
299
+ });
300
+ this.initState.fail();
301
+ }
302
+ }
303
+
304
+ *loadQuery(query: LightQuery): GeneratorFn<void> {
305
+ this.currentQuery = query;
306
+ this.templateQueryTitle = query.name;
307
+
308
+ try {
309
+ this.loadQueryState.inProgress();
310
+ this.currentQueryInfo =
311
+ (yield this.graphManagerState.graphManager.getQueryInfo(
312
+ query.id,
313
+ )) as QueryInfo;
314
+ this.currentQueryProject = StoreProjectData.serialization.fromJson(
315
+ (yield this.depotServerClient.getProject(
316
+ this.currentQuery.groupId,
317
+ this.currentQuery.artifactId,
318
+ )) as PlainObject<StoreProjectData>,
319
+ );
320
+ this.setWorkspaceName(`${DEFAULT_WORKSPACE_NAME_PREFIX}-${query.name}`);
321
+ this.applicationStore.navigationService.navigator.updateCurrentLocation(
322
+ generateDataSpaceTemplateQueryPromotionRoute(
323
+ this.currentQuery.groupId,
324
+ this.currentQuery.artifactId,
325
+ this.currentQuery.versionId,
326
+ this.dataSpacePath,
327
+ query.id,
328
+ ),
329
+ );
330
+ const currentProject = Project.serialization.fromJson(
331
+ (yield this.sdlcServerClient.getProject(
332
+ this.currentQueryProject.projectId,
333
+ )) as PlainObject<Project>,
334
+ );
335
+ yield flowResult(this.loadProject(currentProject));
336
+ } catch (error) {
337
+ assertErrorThrown(error);
338
+ this.applicationStore.notificationService.notifyError(error);
339
+ } finally {
340
+ this.loadQueryState.complete();
341
+ }
342
+ }
343
+
344
+ *loadProject(project: Project): GeneratorFn<void> {
345
+ this.currentProject = project;
346
+ this.currentProjectConfigurationStatus = undefined;
347
+ this.loadWorkspacesState.inProgress();
348
+ try {
349
+ this.currentProjectConfigurationStatus =
350
+ (yield fetchProjectConfigurationStatus(
351
+ project.projectId,
352
+ undefined,
353
+ this.applicationStore,
354
+ this.sdlcServerClient,
355
+ )) as ProjectConfigurationStatus;
356
+ this.groupWorkspaces = (
357
+ (yield this.sdlcServerClient.getGroupWorkspaces(
358
+ project.projectId,
359
+ )) as PlainObject<Workspace>[]
360
+ )
361
+ .map((v) => Workspace.serialization.fromJson(v))
362
+ .filter((workspace) => workspace.workspaceType === WorkspaceType.GROUP);
363
+ this.loadWorkspacesState.pass();
364
+ } catch (error) {
365
+ assertErrorThrown(error);
366
+ this.applicationStore.logService.error(
367
+ LogEvent.create(LEGEND_STUDIO_APP_EVENT.SDLC_MANAGER_FAILURE),
368
+ error,
369
+ );
370
+ this.applicationStore.notificationService.notifyError(error);
371
+ this.loadWorkspacesState.fail();
372
+ }
373
+ }
374
+
375
+ *promoteAsTemplateQuery(): GeneratorFn<void> {
376
+ const query = this.currentQuery;
377
+ const project = this.currentProject;
378
+ if (
379
+ this.promoteState.isInProgress ||
380
+ !query ||
381
+ !this.currentQueryInfo ||
382
+ !this.currentProjectConfiguration ||
383
+ !project ||
384
+ !this.workspaceName ||
385
+ !this.templateQueryTitle ||
386
+ !this.dataSpaceEntity ||
387
+ !this.isWorkspaceNameValid ||
388
+ !this.isTemplateQueryIdValid
389
+ ) {
390
+ return;
391
+ }
392
+
393
+ try {
394
+ this.promoteState.inProgress();
395
+ // 1. prepare project entities
396
+ this.applicationStore.alertService.setBlockingAlert({
397
+ message: `Fetching and updating project...`,
398
+ prompt: 'Please do not close the application',
399
+ showLoading: true,
400
+ });
401
+
402
+ // update datasapce entity
403
+ const updatedDataSpaceEntity =
404
+ (yield this.graphManagerExtension.addNewExecutableToDataSpaceEntity(
405
+ this.dataSpaceEntity,
406
+ {
407
+ id: this.templateQueryId,
408
+ title: this.templateQueryTitle,
409
+ mapping: guaranteeNonNullable(this.currentQueryInfo).mapping,
410
+ runtime: guaranteeNonNullable(this.currentQueryInfo).runtime,
411
+ query: (yield this.graphManagerState.graphManager.pureCodeToLambda(
412
+ this.currentQueryInfo.content,
413
+ )) as RawLambda,
414
+ description: this.templateQueryDescription,
415
+ },
416
+ )) as Entity;
417
+ guaranteeNonNullable(
418
+ this.currentProjectEntities.filter(
419
+ (entity: Entity) =>
420
+ entity.path === this.dataSpacePath &&
421
+ entity.classifierPath === DATA_SPACE_ELEMENT_CLASSIFIER_PATH,
422
+ )[0],
423
+ ).content = updatedDataSpaceEntity.content;
424
+
425
+ // 2. check if the graph compiles properly
426
+ this.applicationStore.alertService.setBlockingAlert({
427
+ message: `Checking workspace compilation status...`,
428
+ prompt: 'Please do not close the application',
429
+ showLoading: true,
430
+ });
431
+ let compilationFailed = false;
432
+ try {
433
+ yield this.graphManagerState.graphManager.compileEntities([
434
+ ...this.dependencyEntities,
435
+ ...this.currentProjectEntities,
436
+ ]);
437
+ } catch {
438
+ compilationFailed = true;
439
+ }
440
+
441
+ // 3. proceed to setup the workspace
442
+ const setupWorkspace = async (): Promise<void> => {
443
+ let workspace: Workspace | undefined;
444
+ try {
445
+ this.applicationStore.alertService.setBlockingAlert({
446
+ message: `Creating workspace...`,
447
+ prompt: 'Please do not close the application',
448
+ showLoading: true,
449
+ });
450
+
451
+ // i. create workspace
452
+ workspace = Workspace.serialization.fromJson(
453
+ await this.sdlcServerClient.createWorkspace(
454
+ project.projectId,
455
+ undefined,
456
+ this.workspaceName,
457
+ WorkspaceType.GROUP,
458
+ ),
459
+ );
460
+
461
+ // ii. update dataspace
462
+ this.applicationStore.alertService.setBlockingAlert({
463
+ message: `Generating code commit...`,
464
+ prompt: 'Please do not close the application',
465
+ showLoading: true,
466
+ });
467
+ await this.sdlcServerClient.performEntityChanges(
468
+ project.projectId,
469
+ workspace,
470
+ {
471
+ message:
472
+ 'promote-as-template-query: promote query as a template query to dataspace',
473
+ entityChanges: [
474
+ {
475
+ classifierPath: updatedDataSpaceEntity.classifierPath,
476
+ entityPath: updatedDataSpaceEntity.path,
477
+ content: updatedDataSpaceEntity.content,
478
+ type: EntityChangeType.MODIFY,
479
+ },
480
+ ],
481
+ },
482
+ );
483
+
484
+ // iii create review
485
+ this.applicationStore.alertService.setBlockingAlert({
486
+ message: `Generating code review...`,
487
+ prompt: 'Please do not close the application',
488
+ showLoading: true,
489
+ });
490
+ await flowResult(
491
+ this.editorStore.initialize(
492
+ project.projectId,
493
+ undefined,
494
+ workspace.workspaceId,
495
+ workspace.workspaceType,
496
+ ),
497
+ );
498
+ const workspaceReviewState = this.editorStore.workspaceReviewState;
499
+ const workspaceContainsSnapshotDependencies =
500
+ this.editorStore.projectConfigurationEditorState
501
+ .containsSnapshotDependencies;
502
+ const isCreateReviewDisabled =
503
+ Boolean(workspaceReviewState.workspaceReview) ||
504
+ workspaceContainsSnapshotDependencies ||
505
+ !workspaceReviewState.canCreateReview ||
506
+ workspaceReviewState.sdlcState.isActiveProjectSandbox;
507
+ workspaceReviewState.reviewTitle =
508
+ 'code review - promote query as a template query to dataspace';
509
+ if (!isCreateReviewDisabled) {
510
+ await flowResult(
511
+ workspaceReviewState.createWorkspaceReview(
512
+ workspaceReviewState.reviewTitle,
513
+ ),
514
+ );
515
+ } else {
516
+ this.applicationStore.notificationService.notifyError(
517
+ `Can't create code review`,
518
+ );
519
+ }
520
+
521
+ // iv. complete, redirect user to the service query editor screen
522
+ this.applicationStore.alertService.setBlockingAlert(undefined);
523
+ this.promoteState.pass();
524
+ this.applicationStore.alertService.setActionAlertInfo({
525
+ message: `Successfully promoted query into dataspace '${this.dataSpacePath}'. Now your template query can be found in workspace '${this.workspaceName}' of project '${project.name}' (${project.projectId})`,
526
+ prompt: compilationFailed
527
+ ? `The workspace might not compile at the moment, please make sure to fix the issue and submit a review to make the dataspace part of the project to complete template query promotion`
528
+ : `Please make sure to get the generated code-review reviewed and approved`,
529
+ type: ActionAlertType.STANDARD,
530
+ actions: compilationFailed
531
+ ? [
532
+ {
533
+ label: 'Open Workspace',
534
+ type: ActionAlertActionType.PROCEED,
535
+ handler: (): void => {
536
+ this.applicationStore.navigationService.navigator.goToLocation(
537
+ generateEditorRoute(
538
+ project.projectId,
539
+ undefined,
540
+ this.workspaceName,
541
+ WorkspaceType.GROUP,
542
+ ),
543
+ );
544
+ },
545
+ default: true,
546
+ },
547
+ ]
548
+ : [
549
+ {
550
+ label: 'Open Code Review',
551
+ type: ActionAlertActionType.PROCEED,
552
+ handler: (): void => {
553
+ if (workspaceReviewState.workspaceReview) {
554
+ this.applicationStore.navigationService.navigator.visitAddress(
555
+ this.applicationStore.navigationService.navigator.generateAddress(
556
+ generateReviewRoute(
557
+ workspaceReviewState.workspaceReview.projectId,
558
+ workspaceReviewState.workspaceReview.id,
559
+ ),
560
+ ),
561
+ );
562
+ }
563
+ },
564
+ default: true,
565
+ },
566
+ {
567
+ label: 'Open Workspace',
568
+ type: ActionAlertActionType.PROCEED,
569
+ handler: (): void => {
570
+ this.applicationStore.navigationService.navigator.goToLocation(
571
+ generateEditorRoute(
572
+ project.projectId,
573
+ undefined,
574
+ this.workspaceName,
575
+ WorkspaceType.GROUP,
576
+ ),
577
+ );
578
+ },
579
+ },
580
+ ],
581
+ });
582
+ } catch (error) {
583
+ assertErrorThrown(error);
584
+ this.applicationStore.alertService.setBlockingAlert(undefined);
585
+ this.applicationStore.notificationService.notifyError(
586
+ `Can't set up workspace: ${error.message}`,
587
+ );
588
+ if (workspace) {
589
+ await this.sdlcServerClient.deleteWorkspace(
590
+ project.projectId,
591
+ workspace,
592
+ );
593
+ }
594
+ this.promoteState.fail();
595
+ }
596
+ };
597
+
598
+ this.applicationStore.alertService.setBlockingAlert(undefined);
599
+ if (compilationFailed) {
600
+ this.applicationStore.alertService.setActionAlertInfo({
601
+ message: `We have found compilation issues with the workspace. Your query can still be promoted, but you would need to fix compilation issues afterwards`,
602
+ prompt: `Do you still want to proceed to promote the query as a template query?`,
603
+ type: ActionAlertType.STANDARD,
604
+ actions: [
605
+ {
606
+ label: `Proceed`,
607
+ type: ActionAlertActionType.PROCEED_WITH_CAUTION,
608
+ handler: (): void => {
609
+ setupWorkspace().catch(
610
+ this.applicationStore.alertUnhandledError,
611
+ );
612
+ },
613
+ },
614
+ {
615
+ label: 'Abort',
616
+ type: ActionAlertActionType.PROCEED,
617
+ handler: (): void => {
618
+ this.promoteState.fail();
619
+ },
620
+ default: true,
621
+ },
622
+ ],
623
+ });
624
+ } else {
625
+ yield setupWorkspace();
626
+ }
627
+
628
+ this.promoteState.pass();
629
+ } catch (error) {
630
+ assertErrorThrown(error);
631
+ this.applicationStore.alertService.setBlockingAlert(undefined);
632
+ this.applicationStore.notificationService.notifyError(error);
633
+ this.promoteState.fail();
634
+ }
635
+ }
636
+ }
package/tsconfig.json CHANGED
@@ -74,6 +74,7 @@
74
74
  "./src/stores/query/DataSpaceQueryCreatorStore.ts",
75
75
  "./src/stores/query/DataSpaceQuerySetupStore.ts",
76
76
  "./src/stores/query/DataSpaceTemplateQueryCreatorStore.ts",
77
+ "./src/stores/query/DataSpaceTemplateQueryPromotionReviewerStore.ts",
77
78
  "./src/stores/studio/DataSpacePreviewState.ts",
78
79
  "./src/components/DSL_DataSpace_Icon.tsx",
79
80
  "./src/components/DSL_DataSpace_LegendApplicationPlugin.tsx",
@@ -100,6 +101,7 @@
100
101
  "./src/components/studio/DSL_DataSpace_LegendStudioApplicationPlugin.tsx",
101
102
  "./src/components/studio/DataSpacePreviewAction.tsx",
102
103
  "./src/components/studio/DataSpaceQueryAction.tsx",
104
+ "./src/components/studio/DataSpaceTemplateQueryPromoteReview.tsx",
103
105
  "./src/graph-manager/protocol/pure/v1/V1_DSL_DataSpace_SystemModels.json"
104
106
  ],
105
107
  "include": [