7
7
uploadTemplateFile ,
8
8
} from "api/api"
9
9
import {
10
- CreateTemplateRequest ,
10
+ CreateTemplateVersionRequest ,
11
11
ParameterSchema ,
12
12
Template ,
13
13
TemplateExample ,
@@ -53,7 +53,7 @@ interface CreateTemplateContext {
53
53
}
54
54
55
55
export const createTemplateMachine =
56
- /** @xstate -layout N4IgpgJg5mDOIC5QGMBOYCGAXMAVMAtgA4A22YAdLFhqlgJYB2UAxANoAMAuoqEQPax6Dfo14gAHogCMAVgDMFDgA5ZATnkKALADY9AdgA0IAJ6I1AJmkVlyi-tk79F2bI4c1AX0-G0mHPjEZDhUNHRMrGzSPEggAkIiYrFSCHKKKuqa8roGxmYI+u4UWgoq0lpqOvJO0t6+6OSBpOQUJPwYEBEAymE4qE3BYCwQopRMAG78ANaUfo2EzSFtHd29YP0LgwgT-MjY9KKcXEfi8cIHSaApOhaK+vrZ8mocOnLK+mp5iMrSyhRqpWUHC0Wh++mUdRAcwCmxay06zB6tD6A3ILHWqH4qAoiwAZliCBRoXhYUt2gioEi6OtUThtoxJntEkcTrEzolxNdbhR7o9nq9ZO9PqZzNILMUXtI1NKAfYtPpIcTaWMICQhgBhABKAFEAIK4bWsviCc6iTmIWQWL4IWT3YoKMWuCzuLQWCE+KENGFBFrQiJEr0RABi9FQ1AAaushKJhqMKDsZgH-CSfSE-cwk-tmCGw1hI2GLvTGftDtwjXETRzkog3X8bm5neplBo3EYRalnBR5PoKs8OBYdGoHLJFV6U4tZoGM+moDmI1GLujUJjsXiCZnvRON-6Z3O8wvREXdiXGCzuKdKxdzalbTp-g7dBxpA9KsL8q6tP99DpZFp5FYOEcCxR2TZVtwzAB3DBzmzLEACl+AAI1wfgACEwHVfggjAHAIFjRgxgZaZJ1A0kSKzKAKCgmDZ3gpCUPQzDsNwo8mQuM8YmNBIr2rAp5GsNQSjleQRMAnRlGtOQOH+GUHAsUEQWkV4QPmVNyIYSDoI02jUAQ5C0IwrDSBwyB8MIyZEyVMjwMo6jtKDOj9MYoy1RYnY2NLY5ogvbizV4h4BKEnsRPkMSJPbexrB7aVlEeQppHkd16lItSbKorTg0chjDOY0yMSxHFgnxVBCSs1KZ3SmiHN0+iDKY4y3KIjzTzLc82UvPyrhkW9734x9nyeQdrRE6xLREywNGbHQOAVD0yq3CqiExYgsAABVoDACBMsMWHVAB5AA5XAAEkDoAVUNNquNNS5JBkKw1AoX4e37Ac3VuSTO3lH9bVcD4LFuJLPRShap0omdlTM+MiMsscwIqiGyNYk8OJ8m7rzkb9evKaaBtfa1lDvWx+wSwmny0GbZuS1TQf8Hcwch-LVyK9d5sGNLEbU5HmVaziK1826Ukxu8AT63GXyG9tfmkkKQop5xu1cbwPUYfgIDgcQ2fINGqy6hAAFo30QfXuRlM3zbUIGtZCahkQiHWeL111rTUBKeSUlRvw0AE9BUzd2fhVZkRpMiHc6u6EGqfQno+Qdm2+qoQQJyoKCqexZGkFQnmBP3x3Z+hVTAMPBZkYKKHsbJpsE1xnyNm07VF6RM8xj4c7muHrJnYvryea0qmKc3ynUTOn1z+GwZsvd82jW72UdiP3kk1QnqfVxAPBH43CtjvyonuzMpqpycoayBu94kFHoUzRf3439LB0T7pNUOQ3EqWOXh0MfO4npajLWjatp9HgO1AWGN+x-A3hoMUdhYryU+uKIcP1hz-UBl-XedNpwM1DiA9GvEEqvC7JoWwLhoH6ClJJHQn5XCWx7C4P8P55BoNpuQCAZ89bPkzjYGBVgLBDlihweQkkZqpxeLyX8Vhmy1GVkAA */
56
+ /** @xstate -layout N4IgpgJg5mDOIC5QGMBOYCGAXMAVMAtgA4A22YAdLFhqlgJYB2UAxANoAMAuoqEQPax6Dfo14gAHogCMAVgDMFDgA5ZATlkAWaR1kA2TcukAaEAE9E8jgCYKa62r0B2Wao7zlatQF9vptJg4+MRkOFQ0dEysbNI8SCACQiJi8VIIcooq6lo6+oYm5ohGFJpeXk7W1h5O8nK+-ujkwaTkFCT8GBBRAMoROKjNoWAsEKKUTABu-ADWlAFNhC1h7Z09fWADi0MIk-zI2PSinFzH4onChymgaXpVFE41mq6aHJpO5aYW6V52ZWo10mssmkymUTnqIHmQS2rRWXWYvVo-UG5BYG1Q-FQFCWADNMQQKFC8DDlh14VBEXQNiicDtGFN9sljqd4udkuIbncHvInsoXm8PoUEA5FE9arprAZHHplBCiTTxhASMMAMIAJQAogBBXAall8QQXUQcxCyayfGRmtQlDg6TR6eRS+SVOWNaEhVr0JXDACqAAUADIAeS1ABEAPoAMQAkgG9dwzob2alENZtPcefI1PInG8OI5zUKPHo7Bxbgp3qCVKpXYFiR6wl7lSxNQBZIMANQ1Udj8biBqSlxNCHkOc0SmzaiMwOkTnzFvSmh5FCs7w4lb0OgetYWDcoAFdSGSoiMxhRdrNCW760sD0fVsw6QyDkduPqEkmhynhenHlmx3OBYLoYijyOoHjSGoKgvPmO7ureFCHnCJ7opi2KhHiqAEvKJJ3shj67IylzMgmrKfsa35AtY0glAoVSAtIjGzgushOCWRhpp4yh6NBoJwTeQxXoEURCQczCRvQqDUB2GxCKIp6MOM9IzHM14KqJDDMBpUQSVJWAyVJlxPnsL6MCR-YfoOFHXIg7yKA61jKB4CjSKOzoLnaJbUU81gqOuHg5vx6lQiJIXiZJ0myZcaKoBiWK4viGkCa0YVQNp4V6QZcmMMZRGvicpEDkaVySKmZo0WK9HUUxTgeTytilKUjG3I5VFBbh6VpQA7hgFziZiABS-AAEa4PwABCYAqvwIRgDgEAKUpUyXjhe6dRQPV9VAkaDSNY2TdNs3zblpnmYmVklWk0gvA1bGuNYgGuTmHm6CWThGCCDjQfmsp+JCakdalG29Zp227aNE1TTNpBzZAi3nspK0A2tQObaDO2oENEMHdDyrHYRp1vrE53FcOQK1LRzq1NVjG1UKa4UM4IIKDyLxyLI7Uo26Ilozp4P7VDR1w6MikI8tql1sF3Nabz-WY3tkOHTD+PKXlZlvtYFlsl+NmLjYJR3coD35k9dNfI4oGOeupSyOoLWcwhqMg3z8vY4Lytw6h8UYYlq2O9L3XO3LWMC0reOQCdTJvoVlmk5R5WU1VTHMUKoLjoCpSbg4BgOpoDuCUD+FQK29CwEIzB+rQGAELDUnwxeEu7v7wlaUXJdl1EleoNXtewJHxHR1r5GXTIm4lhwE8SvYVggvIdWuIzuaaNRViaE14J-X7BcB20x7MO35dQF3Pf9LAMVxeh2CYdhyPN2JaVt6Xh-HzXp-9-l77a9ZpXCgnlXU8nM2MglyyDsIYW0GgXAPXkPnFKO8iAYmIFgF+vcWDqm1LqT+w8yZGxXFOJcLxQR6FkNBBc2YnBKEYoQkC2gniwLCEDVKWVLgAHVhAAAsUGn3rojRu8Ft4tzSkwqKog2FYE4VXV+sl37qwKkPC6w47KM2dE5VQtQ3KFnNmae4m5tCOS0NmVw9C+GhQDsw0RHCuGyXPmhBKWEkpS0EZ1cxjAxESO7lIqSMizpkQUfHdM-8GI1QXHof4FBqJgjFGoOQzgN4NEloDHeqUFQ8PFg4xJTjkm4W8YPEmyZdYr3HhPaQPFHKGD5EAhATlQFgTkHIB6kowQc03rfAR99OopK9pfLA190lc0yQHBUOS5F5J1j-KiFU6IAOCUKf4FDWLKDLPYQw0TXK+D+owfgEA4DiC3uQUZ380gAFo1ALiOaAv4ly-gGGafEpuglqBIiiAckeCBl4LgcOONiVhbTODBCU66xjd4PgpOsTYe4XnDkdBQ2c-x8wTx5PmN4HyHiL0cC4Kw913hAqbGASFlEvDjloQ9KC3FPD2g8goUBbEdCOnzPoMoQKkJ7ygPi3W7yhQChXGBbMD05Dri8DAlpCT+n3zZT-LMC5cwUNUBkVw7hZxgSBYwgOulIqGW-l-V5tsODhOIQYJF3FIKaJkLPcJmY1CGGBHyewyqd6yzBq7UOuNYYQHFVdLIFASnaEYloMsQIXoOEZuuRZVqpxODqMK+5cCnGPw7hXSRvd3UyG4uOfBS5JTaA8K8Oq6YqhLgqDYR09ohV3P4TG9pCDobIMTafZNVTKmuRcEoWJVLNysVtnagZgiXFuKsVJet4ClBzlqFBEhHg3iaDIY6OwYIpyOHArcOJ-0RV31Bh03C9aQT2AoKo5wy9OIRrIZuXdrwc66Dck5Lt7SiRut8XHApiL7gKoeLcRZjEFyqHHu9fMAUYK1HWd4IAA */
57
57
createMachine (
58
58
{
59
59
id : "createTemplate" ,
@@ -74,6 +74,9 @@ export const createTemplateMachine =
74
74
createFirstVersion : {
75
75
data : TemplateVersion
76
76
}
77
+ createVersionWithParameters : {
78
+ data : TemplateVersion
79
+ }
77
80
waitForJobToBeCompleted : {
78
81
data : TemplateVersion
79
82
}
@@ -118,9 +121,11 @@ export const createTemplateMachine =
118
121
UPLOAD_FILE : {
119
122
actions : [ "assignFile" ] ,
120
123
target : "uploading" ,
124
+ cond : "isFromScratch" ,
121
125
} ,
122
126
REMOVE_FILE : {
123
127
actions : [ "removeFile" ] ,
128
+ cond : "hasFile" ,
124
129
} ,
125
130
} ,
126
131
} ,
@@ -194,11 +199,25 @@ export const createTemplateMachine =
194
199
promptParameters : {
195
200
on : {
196
201
CREATE : {
197
- target : "creatingTemplate " ,
202
+ target : "creatingVersionWithParameters " ,
198
203
actions : [ "assignTemplateData" ] ,
199
204
} ,
200
205
} ,
201
206
} ,
207
+ creatingVersionWithParameters : {
208
+ invoke : {
209
+ src : "createVersionWithParameters" ,
210
+ onDone : {
211
+ target : "waitingForJobToBeCompleted" ,
212
+ actions : [ "assignVersion" ] ,
213
+ } ,
214
+ onError : {
215
+ actions : [ "assignError" ] ,
216
+ target : "promptParameters" ,
217
+ } ,
218
+ } ,
219
+ tags : [ "submitting" ] ,
220
+ } ,
202
221
creatingTemplate : {
203
222
invoke : {
204
223
src : "createTemplate" ,
@@ -236,15 +255,65 @@ export const createTemplateMachine =
236
255
}
237
256
return starterTemplate
238
257
} ,
239
- createFirstVersion : async ( { organizationId, exampleId } ) => {
240
- if ( ! exampleId ) {
241
- throw new Error ( "No example ID provided" )
258
+ createFirstVersion : async ( {
259
+ organizationId,
260
+ exampleId,
261
+ uploadResponse,
262
+ } ) => {
263
+ if ( exampleId ) {
264
+ return createTemplateVersion ( organizationId , {
265
+ storage_method : "file" ,
266
+ example_id : exampleId ,
267
+ provisioner : "terraform" ,
268
+ tags : { } ,
269
+ } )
270
+ }
271
+
272
+ if ( uploadResponse ) {
273
+ return createTemplateVersion ( organizationId , {
274
+ storage_method : "file" ,
275
+ file_id : uploadResponse . hash ,
276
+ provisioner : "terraform" ,
277
+ tags : { } ,
278
+ } )
279
+ }
280
+
281
+ throw new Error ( "No file or example provided" )
282
+ } ,
283
+ createVersionWithParameters : async ( {
284
+ organizationId,
285
+ parameters,
286
+ templateData,
287
+ version,
288
+ } ) => {
289
+ if ( ! version ) {
290
+ throw new Error ( "No previous version found" )
291
+ }
292
+ if ( ! templateData ) {
293
+ throw new Error ( "No template data defined" )
294
+ }
295
+
296
+ const { parameter_values_by_name } = templateData
297
+ // Get parameter values if they are needed/present
298
+ const parameterValues : CreateTemplateVersionRequest [ "parameter_values" ] =
299
+ [ ]
300
+ if ( parameters ) {
301
+ parameters . forEach ( ( schema ) => {
302
+ const value = parameter_values_by_name ?. [ schema . name ]
303
+ parameterValues . push ( {
304
+ name : schema . name ,
305
+ source_value : value ?? schema . default_source_value ,
306
+ destination_scheme : schema . default_destination_scheme ,
307
+ source_scheme : schema . default_source_scheme ,
308
+ } )
309
+ } )
242
310
}
243
311
244
312
return createTemplateVersion ( organizationId , {
245
313
storage_method : "file" ,
246
- example_id : exampleId ,
314
+ file_id : version . job . file_id ,
247
315
provisioner : "terraform" ,
316
+ parameter_values : parameterValues ,
248
317
tags : { } ,
249
318
} )
250
319
} ,
@@ -267,12 +336,7 @@ export const createTemplateMachine =
267
336
268
337
return getTemplateVersionSchema ( version . id )
269
338
} ,
270
- createTemplate : async ( {
271
- organizationId,
272
- version,
273
- templateData,
274
- parameters,
275
- } ) => {
339
+ createTemplate : async ( { organizationId, version, templateData } ) => {
276
340
if ( ! version ) {
277
341
throw new Error ( "Version not defined" )
278
342
}
@@ -287,25 +351,10 @@ export const createTemplateMachine =
287
351
...safeTemplateData
288
352
} = templateData
289
353
290
- // Get parameter values if they are needed/present
291
- const parameterValues : CreateTemplateRequest [ "parameter_values" ] = [ ]
292
- if ( parameters ) {
293
- parameters . forEach ( ( schema ) => {
294
- const value = parameter_values_by_name ?. [ schema . name ]
295
- parameterValues . push ( {
296
- name : schema . name ,
297
- source_value : value ?? schema . default_source_value ,
298
- destination_scheme : schema . default_destination_scheme ,
299
- source_scheme : schema . default_source_scheme ,
300
- } )
301
- } )
302
- }
303
-
304
354
return createTemplate ( organizationId , {
305
355
...safeTemplateData ,
306
356
default_ttl_ms : templateData . default_ttl_hours * 60 * 60 * 1000 , // Convert hours to ms
307
357
template_version_id : version . id ,
308
- parameter_values : parameterValues ,
309
358
} )
310
359
} ,
311
360
} ,
@@ -331,7 +380,9 @@ export const createTemplateMachine =
331
380
} ) ,
332
381
} ,
333
382
guards : {
334
- isExampleProvided : ( { exampleId } ) => Boolean ( exampleId ) ,
383
+ isExampleProvided : ( { exampleId } ) => exampleId !== undefined ,
384
+ isFromScratch : ( { exampleId } ) => exampleId === undefined ,
385
+ hasFile : ( { file } ) => file !== undefined ,
335
386
hasFailed : ( _ , { data } ) => data . job . status === "failed" ,
336
387
hasMissingParameters : ( _ , { data } ) =>
337
388
Boolean (
0 commit comments