diff --git a/models/benchmark.go b/models/benchmark.go index f9f2b05..4c4712a 100644 --- a/models/benchmark.go +++ b/models/benchmark.go @@ -1,6 +1,8 @@ package models import ( + "strconv" + "gorm.io/gorm" ) @@ -16,3 +18,7 @@ type Benchmark struct { // has many results Results []Result } + +func (b *Benchmark) StringID() string { + return strconv.Itoa(int(b.ID)) +} diff --git a/models/test.go b/models/test.go index f378baf..a4630c7 100644 --- a/models/test.go +++ b/models/test.go @@ -1,6 +1,8 @@ package models import ( + "strconv" + "gorm.io/gorm" ) @@ -19,3 +21,12 @@ type Test struct { // has many results Results []Result } + +func (t *Test) SelectedBenchmarks() []string { + benchmarks := t.Benchmarks + ids := make([]string, len(benchmarks)) + for i, b := range benchmarks { + ids[i] = strconv.Itoa(int(b.ID)) + } + return ids +} diff --git a/templates/test/edit.tmpl b/templates/test/edit.tmpl index 5c1d642..5ef7d0a 100644 --- a/templates/test/edit.tmpl +++ b/templates/test/edit.tmpl @@ -30,9 +30,9 @@ diff --git a/web/routes/test.go b/web/routes/test.go index 510215e..b2c7afa 100644 --- a/web/routes/test.go +++ b/web/routes/test.go @@ -99,6 +99,47 @@ func TestGetEdit(c flamego.Context, t template.Template, data template.Data) { models.DB.Find(&benchmarks) data["benchmarks"] = benchmarks + // determine which benchmarks are selected in a test + selectedBenchmarks := test.SelectedBenchmarks() + data["selectedBenchmarks"] = selectedBenchmarks + data["title"] = fmt.Sprintf("Editing Test: %s", test.Name) t.HTML(http.StatusOK, "test/edit") } + +func TestPostEdit(c flamego.Context, form forms.TestForm, errs binding.Errors) { + if len(errs) > 0 { + var err error + switch errs[0].Category { + case binding.ErrorCategoryValidation: + err = errs[0].Err.(validator.ValidationErrors)[0] + default: + err = errs[0].Err + } + log.Fatal(err) + } + + // find test ID from request + testID := c.Param("test_id") + + // find hardware from DB + var test models.Test + models.DB.Preload("Hardware").Preload("Benchmarks").First(&test, testID) + + test := models.Test{ + Name: form.Name, + Description: form.Description, + HardwareID: form.Hardware, + } + + _ = models.DB.Create(&test) + + // bind benchmarks to test + for _, v := range form.Benchmarks { + var benchmark models.Benchmark + models.DB.First(&benchmark, v) // find benchmark + models.DB.Model(&test).Association("Benchmarks").Append(&benchmark) + } + + c.Redirect(fmt.Sprintf("/test/%d", test.ID)) +}