@@ -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 ,