@@ -442,6 +442,57 @@ func (b *Builder) buildTx(authFunc func(action policy.Action, object rbac.Object
442
442
443
443
var workspaceBuild database.WorkspaceBuild
444
444
err = b .store .InTx (func (store database.Store ) error {
445
+ names , values , err := b .getParameters ()
446
+ if err != nil {
447
+ // getParameters already wraps errors in BuildError
448
+ return err
449
+ }
450
+
451
+ if b .templateVersionPresetID == uuid .Nil {
452
+ parameterMap := make (map [string ]string )
453
+ for i , name := range names {
454
+ parameterMap [name ] = values [i ]
455
+ }
456
+
457
+ presetParameters , err := b .store .GetPresetParametersByTemplateVersionID (b .ctx , templateVersionID )
458
+ if err != nil {
459
+ return BuildError {http .StatusInternalServerError , "get preset parameters" , err }
460
+ }
461
+
462
+ presetMap := make (map [uuid.UUID ]map [string ]string )
463
+ for _ , presetParameter := range presetParameters {
464
+ if _ , ok := presetMap [presetParameter .TemplateVersionPresetID ]; ! ok {
465
+ presetMap [presetParameter .TemplateVersionPresetID ] = make (map [string ]string )
466
+ }
467
+ presetMap [presetParameter.TemplateVersionPresetID ][presetParameter.Name ] = presetParameter .Value
468
+ }
469
+
470
+ // Compare each preset's parameters to the provided parameters to find any matches
471
+ for presetID , presetParams := range presetMap {
472
+ isMatch := true
473
+ // Check that all preset parameters match the provided parameters
474
+ for paramName , presetValue := range presetParams {
475
+ if providedValue , exists := parameterMap [paramName ]; ! exists || providedValue != presetValue {
476
+ isMatch = false
477
+ break
478
+ }
479
+ }
480
+ // Check that all provided parameters match the preset parameters
481
+ if isMatch {
482
+ for paramName , providedValue := range parameterMap {
483
+ if presetValue , exists := presetParams [paramName ]; ! exists || providedValue != presetValue {
484
+ isMatch = false
485
+ break
486
+ }
487
+ }
488
+ }
489
+ if isMatch {
490
+ b .templateVersionPresetID = presetID
491
+ break
492
+ }
493
+ }
494
+ }
495
+
445
496
err = store .InsertWorkspaceBuild (b .ctx , database.InsertWorkspaceBuildParams {
446
497
ID : workspaceBuildID ,
447
498
CreatedAt : now ,
@@ -473,12 +524,6 @@ func (b *Builder) buildTx(authFunc func(action policy.Action, object rbac.Object
473
524
return BuildError {code , "insert workspace build" , err }
474
525
}
475
526
476
- names , values , err := b .getParameters ()
477
- if err != nil {
478
- // getParameters already wraps errors in BuildError
479
- return err
480
- }
481
-
482
527
err = store .InsertWorkspaceBuildParameters (b .ctx , database.InsertWorkspaceBuildParametersParams {
483
528
WorkspaceBuildID : workspaceBuildID ,
484
529
Name : names ,
0 commit comments