diff --git a/models/Benchmark_profile.go b/models/Benchmark_profile.go new file mode 100644 index 0000000..d30dc59 --- /dev/null +++ b/models/Benchmark_profile.go @@ -0,0 +1,27 @@ +package models + +import ( + "strconv" + + "gorm.io/gorm" +) + +type BenchmarkProfile struct { + gorm.Model + Label string + Settings string + + // belongs to Benchmark + BenchmarkID int + Benchmark Benchmark + + // many-to-many with tests + Tests []Test `gorm:"many2many:tests_benchmark_profiles;"` + + // has many results + Results []Result +} + +func (b *BenchmarkProfile) StringID() string { + return strconv.Itoa(int(b.ID)) +} diff --git a/models/benchmark.go b/models/benchmark.go index 4c4712a..51dc064 100644 --- a/models/benchmark.go +++ b/models/benchmark.go @@ -12,11 +12,8 @@ type Benchmark struct { ScoringType string Description string - // many-to-many test - Tests []Test `gorm:"many2many:tests_benchmarks;"` - - // has many results - Results []Result + // one-to-many BenchmarkProfiles + BenchmarkProfiles []BenchmarkProfile } func (b *Benchmark) StringID() string { diff --git a/models/result.go b/models/result.go index 63e44dd..86e7a0f 100644 --- a/models/result.go +++ b/models/result.go @@ -11,8 +11,8 @@ type Result struct { MaximumScore float32 // belongs to Benchmark - BenchmarkID int - Benchmark Benchmark + BenchmarkProfileID int + BenchmarkProfile BenchmarkProfile // belongs to Test TestID int diff --git a/models/test.go b/models/test.go index e334707..ed60435 100644 --- a/models/test.go +++ b/models/test.go @@ -15,15 +15,15 @@ type Test struct { HardwareID int Hardware Hardware - // many-to-many benchmarks - Benchmarks []Benchmark `gorm:"many2many:tests_benchmarks;"` + // many-to-many benchmark profiles + BenchmarkProfiles []Benchmark `gorm:"many2many:tests_benchmark_profiles;"` // has many results Results []Result } func (t *Test) SelectedBenchmarks() []string { - benchmarks := t.Benchmarks + benchmarks := t.BenchmarkProfiles ids := make([]string, len(benchmarks)) for i, b := range benchmarks { ids[i] = strconv.Itoa(int(b.ID)) @@ -34,7 +34,7 @@ func (t *Test) SelectedBenchmarks() []string { func (t *Test) IsBenchmarkSelected(benchmarkID uint) bool { benchmarkUint := uint(benchmarkID) - for _, b := range t.Benchmarks { + for _, b := range t.BenchmarkProfiles { if b.ID == benchmarkUint { return true } diff --git a/templates/benchmark/profile/add.tmpl b/templates/benchmark/profile/add.tmpl new file mode 100644 index 0000000..c50fda6 --- /dev/null +++ b/templates/benchmark/profile/add.tmpl @@ -0,0 +1,37 @@ +{{ template "header" . }} + +
There are currently no results recorded using this benchmark.
diff --git a/web/forms/benchmark_profile.go b/web/forms/benchmark_profile.go new file mode 100644 index 0000000..151147c --- /dev/null +++ b/web/forms/benchmark_profile.go @@ -0,0 +1,7 @@ +package forms + +type BenchmarkProfileForm struct { + BenchmarkID int `form:"benchmark_profile_benchmark" validate:"required"` + Label string `form:"benchmark_profile_label" validate:"required"` + Settings string `form:"benchmark_profile_settings" validate:"required"` +} diff --git a/web/forms/result.go b/web/forms/result.go index 45ed3ec..cae0cee 100644 --- a/web/forms/result.go +++ b/web/forms/result.go @@ -1,9 +1,9 @@ package forms type ResultForm struct { - Test int `form:"result_test" validate:"required"` - Benchmark int `form:"result_benchmark" validate:"required"` - AverageScore float32 `form:"result_avg" validate:"required"` - MinimumScore float32 `form:"result_min"` - MaximumScore float32 `form:"result_max"` + Test int `form:"result_test" validate:"required"` + BenchmarkProfile int `form:"result_benchmark" validate:"required"` + AverageScore float32 `form:"result_avg" validate:"required"` + MinimumScore float32 `form:"result_min"` + MaximumScore float32 `form:"result_max"` } diff --git a/web/forms/test.go b/web/forms/test.go index 8981235..16990c3 100644 --- a/web/forms/test.go +++ b/web/forms/test.go @@ -1,14 +1,14 @@ package forms type TestForm struct { - Name string `form:"test_name" validate:"required"` - Description string `form:"test_description"` - Hardware int `form:"test_hardware" validate:"required"` - Benchmarks []uint `form:"test_benchmarks" validate:"required"` + Name string `form:"test_name" validate:"required"` + Description string `form:"test_description"` + Hardware int `form:"test_hardware" validate:"required"` + BenchmarkProfiles []uint `form:"test_benchmarks" validate:"required"` } func (t *TestForm) IsBenchmarkSelected(checkID uint) bool { - for _, selectedID := range t.Benchmarks { + for _, selectedID := range t.BenchmarkProfiles { if checkID == selectedID { return true } diff --git a/web/routes.go b/web/routes.go index 4b894a7..0e78455 100644 --- a/web/routes.go +++ b/web/routes.go @@ -44,6 +44,11 @@ func RegisterRoutes(f *flamego.Flame) { f.Get("/{benchmark_id}/edit", routes.BenchmarkGetEdit) f.Post("/{benchmark_id}/edit", binding.Form(forms.BenchmarkForm{}), routes.BenchmarkPostEdit) + + f.Group("/{benchmark_id}/profile", func() { + f.Get("/add", routes.BenchmarkGetProfileAdd) + f.Post("/add", binding.Form(forms.BenchmarkProfileForm{}), routes.BenchmarkPostProfileAdd) + }) }) // test routes @@ -76,6 +81,10 @@ func RegisterRoutes(f *flamego.Flame) { f.Get("/details", routes.ApiV1BenchmarkDetails) }) + f.Group("/benchmark_profile", func() { + f.Get("/details", routes.ApiV1BenchmarkProfileDetails) + }) + f.Group("/result", func() { f.Post("/add", binding.Form(forms.ResultForm{}), routes.ApiV1ResultAdd) f.Get("/list", routes.ApiV1ResultList) diff --git a/web/routes/api_v1.go b/web/routes/api_v1.go index 6fe157a..00272e8 100644 --- a/web/routes/api_v1.go +++ b/web/routes/api_v1.go @@ -18,11 +18,23 @@ func ApiV1BenchmarkDetails(c flamego.Context, r flamego.Render) { // find benchmark from DB var benchmark models.Benchmark models.DB.First(&benchmark, benchmarkID) - + // return JSON response r.JSON(200, benchmark) } +func ApiV1BenchmarkProfileDetails(c flamego.Context, r flamego.Render) { + // find benchmark ID from request + benchmarkProfileID := c.Query("benchmark_profile_id") + + // find benchmark from DB + var benchmarkProfile models.BenchmarkProfile + models.DB.Preload("BenchmarkProfiles").First(&benchmarkProfile, benchmarkProfileID) + + // return JSON response + r.JSON(200, benchmarkProfile) +} + func ApiV1ResultAdd(c flamego.Context, form forms.ResultForm, errs binding.Errors, r flamego.Render) { if len(errs) > 0 { var err error @@ -36,8 +48,8 @@ func ApiV1ResultAdd(c flamego.Context, form forms.ResultForm, errs binding.Error } result := models.Result{ - TestID: form.Test, - BenchmarkID: form.Benchmark, + TestID: form.Test, + BenchmarkProfileID: form.BenchmarkProfile, AverageScore: form.AverageScore, MinimumScore: form.MinimumScore, MaximumScore: form.MaximumScore, @@ -50,12 +62,12 @@ func ApiV1ResultAdd(c flamego.Context, form forms.ResultForm, errs binding.Error func ApiV1ResultList(c flamego.Context, r flamego.Render) { // find benchmark and test IDs from request - benchmarkID := c.Query("benchmark_id") + benchmarkProfileID := c.Query("benchmark_id") testID := c.Query("test_id") // find results from the DB that match the benchmark and test var results []models.Result - models.DB.Where("test_id = ? AND benchmark_id = ?", testID, benchmarkID).Find(&results) + models.DB.Where("test_id = ? AND benchmark_profile_id = ?", testID, benchmarkProfileID).Find(&results) // return JSON response r.JSON(200, results) diff --git a/web/routes/benchmark.go b/web/routes/benchmark.go index c06488d..aed1555 100644 --- a/web/routes/benchmark.go +++ b/web/routes/benchmark.go @@ -30,7 +30,7 @@ func BenchmarkGetView(c flamego.Context, t template.Template, data template.Data // find benchmark from DB var benchmark models.Benchmark - models.DB.First(&benchmark, benchmarkID) + models.DB.Preload("BenchmarkProfiles").First(&benchmark, benchmarkID) data["benchmark"] = benchmark data["title"] = benchmark.Name @@ -105,3 +105,37 @@ func BenchmarkPostEdit(c flamego.Context, form forms.BenchmarkForm, errs binding c.Redirect(fmt.Sprintf("/benchmark/%d", benchmark.ID)) } + +func BenchmarkGetProfileAdd(c flamego.Context, t template.Template, data template.Data) { + // find benchmark ID from request + benchmarkID := c.Param("benchmark_id") + + // find benchmark from DB + var benchmark models.Benchmark + models.DB.First(&benchmark, benchmarkID) + data["benchmark"] = benchmark + + data["title"] = benchmark.Name + t.HTML(http.StatusOK, "benchmark/profile/add") +} + +func BenchmarkPostProfileAdd(c flamego.Context, form forms.BenchmarkProfileForm, errs binding.Errors) { + // find benchmark ID from request + benchmarkID := c.Param("benchmark_id") + + // find benchmark from DB + var benchmark models.Benchmark + models.DB.First(&benchmark, benchmarkID) + + benchmarkProfile := models.BenchmarkProfile{ + BenchmarkID: form.BenchmarkID, + Label: form.Label, + Settings: form.Settings, + } + + fmt.Println(form.BenchmarkID) + + _ = models.DB.Create(&benchmarkProfile) + + c.Redirect(fmt.Sprintf("/benchmark/%d", benchmark.ID)) +} diff --git a/web/routes/result.go b/web/routes/result.go index e95831d..57fcfe2 100644 --- a/web/routes/result.go +++ b/web/routes/result.go @@ -26,7 +26,7 @@ func ResultPostCreate(c flamego.Context, form forms.ResultForm, errs binding.Err result := models.Result{ TestID: form.Test, - BenchmarkID: form.Benchmark, + BenchmarkProfileID: form.BenchmarkProfile, AverageScore: form.AverageScore, MinimumScore: form.MinimumScore, MaximumScore: form.MaximumScore, diff --git a/web/routes/test.go b/web/routes/test.go index 0c246af..3dc1317 100644 --- a/web/routes/test.go +++ b/web/routes/test.go @@ -73,10 +73,10 @@ func TestPostCreate(c flamego.Context, form forms.TestForm, errs binding.Errors) _ = models.DB.Create(&test) // bind benchmarks to test - for _, v := range form.Benchmarks { + for _, v := range form.BenchmarkProfiles { var benchmark models.Benchmark models.DB.First(&benchmark, v) // find benchmark - models.DB.Model(&test).Association("Benchmarks").Append(&benchmark) + models.DB.Model(&test).Association("BenchmarkProfiles").Append(&benchmark) } c.Redirect(fmt.Sprintf("/test/%d", test.ID)) @@ -86,7 +86,7 @@ func TestGetEdit(c flamego.Context, t template.Template, data template.Data) { // find test in DB testID := c.Param("test_id") var test models.Test - models.DB.Preload("Hardware").Preload("Benchmarks").First(&test, testID) + models.DB.Preload("Hardware").Preload("BenchmarkProfiles").First(&test, testID) data["test"] = test // add hardware components to template @@ -124,27 +124,27 @@ func TestPostEdit(c flamego.Context, form forms.TestForm, errs binding.Errors) { // find hardware from DB var test models.Test - models.DB.Preload("Hardware").Preload("Benchmarks").First(&test, testID) + models.DB.Preload("Hardware").Preload("BenchmarkProfiles").First(&test, testID) test.Name = form.Name test.Description = form.Description test.HardwareID = form.Hardware // bind benchmarks to test that aren't already associated - for _, b := range form.Benchmarks { + for _, b := range form.BenchmarkProfiles { if ! test.IsBenchmarkSelected(b) { - var benchmark models.Benchmark + var benchmark models.BenchmarkProfile models.DB.First(&benchmark, b) // find benchmark - models.DB.Model(&test).Association("Benchmarks").Append(&benchmark) + models.DB.Model(&test).Association("BenchmarkProfiles").Append(&benchmark) } } // removed associated benchmarks that weren't in the form - for _, b := range test.Benchmarks { + for _, b := range test.BenchmarkProfiles { if ! form.IsBenchmarkSelected(b.ID) { - var benchmark models.Benchmark + var benchmark models.BenchmarkProfile models.DB.First(&benchmark, b) // find benchmark - models.DB.Model(&test).Association("Benchmarks").Delete(&benchmark) + models.DB.Model(&test).Association("BenchmarkProfiles").Delete(&benchmark) } }