diff --git a/database/models.go b/database/models.go index 3063254..0ab8fc6 100644 --- a/database/models.go +++ b/database/models.go @@ -91,6 +91,8 @@ type SimulationModel struct { InputMapping []Signal `json:"-" gorm:"foreignkey:SimulationModelID"` // Files of simulation model (can be CIM and other simulation model file formats) Files []File `json:"-" gorm:"foreignkey:SimulationModelID"` + // Currently selected simulation model FileID + SelectedModelFileID uint `json:"selectedModelFileID" gorm:"default:0"` } // Signal data model diff --git a/database/testdata.go b/database/testdata.go index 48cbbf7..d0b95b4 100644 --- a/database/testdata.go +++ b/database/testdata.go @@ -101,13 +101,15 @@ var ScenarioB = Scenario{ // Simulation Models var SimulationModelA = SimulationModel{ - Name: "SimulationModel_A", - StartParameters: postgres.Jsonb{startParametersA}, + Name: "SimulationModel_A", + StartParameters: postgres.Jsonb{startParametersA}, + SelectedModelFileID: 1, } var SimulationModelB = SimulationModel{ - Name: "SimulationModel_B", - StartParameters: postgres.Jsonb{startParametersB}, + Name: "SimulationModel_B", + StartParameters: postgres.Jsonb{startParametersB}, + SelectedModelFileID: 2, } // Signals @@ -268,7 +270,6 @@ var WidgetE = Widget{ CustomProperties: postgres.Jsonb{customPropertiesLamp}, } - func DBAddAdminUser(db *gorm.DB) error { db.AutoMigrate(&User{}) @@ -338,7 +339,6 @@ func DBAddTestData(db *gorm.DB) error { widgetD := WidgetD widgetE := WidgetE - // Users err := db.Create(&user0).Error @@ -410,8 +410,6 @@ func DBAddTestData(db *gorm.DB) error { err = db.Model(&dashboardA).Association("Widgets").Append(&widgetD).Error err = db.Model(&dashboardA).Association("Widgets").Append(&widgetE).Error - - // SimulationModel HM Signals err = db.Model(&modelA).Association("InputMapping").Append(&inSignalA).Error err = db.Model(&modelA).Association("InputMapping").Append(&inSignalB).Error diff --git a/routes/simulationmodel/simulationmodel_methods.go b/routes/simulationmodel/simulationmodel_methods.go index bc7038f..6b23021 100644 --- a/routes/simulationmodel/simulationmodel_methods.go +++ b/routes/simulationmodel/simulationmodel_methods.go @@ -103,9 +103,10 @@ func (m *SimulationModel) Update(modifiedSimulationModel SimulationModel) error } err := db.Model(m).Updates(map[string]interface{}{ - "Name": modifiedSimulationModel.Name, - "StartParameters": modifiedSimulationModel.StartParameters, - "SimulatorID": modifiedSimulationModel.SimulatorID, + "Name": modifiedSimulationModel.Name, + "StartParameters": modifiedSimulationModel.StartParameters, + "SimulatorID": modifiedSimulationModel.SimulatorID, + "SelectedModelFileID": modifiedSimulationModel.SelectedModelFileID, }).Error return err diff --git a/routes/simulationmodel/simulationmodel_test.go b/routes/simulationmodel/simulationmodel_test.go index 8c13beb..1a3fff5 100644 --- a/routes/simulationmodel/simulationmodel_test.go +++ b/routes/simulationmodel/simulationmodel_test.go @@ -41,10 +41,11 @@ var router *gin.Engine var db *gorm.DB type SimulationModelRequest struct { - Name string `json:"name,omitempty"` - ScenarioID uint `json:"scenarioID,omitempty"` - SimulatorID uint `json:"simulatorID,omitempty"` - StartParameters postgres.Jsonb `json:"startParameters,omitempty"` + Name string `json:"name,omitempty"` + ScenarioID uint `json:"scenarioID,omitempty"` + SimulatorID uint `json:"simulatorID,omitempty"` + StartParameters postgres.Jsonb `json:"startParameters,omitempty"` + SelectedModelFileID uint `json:"selectedModelFileID,omitempty"` } type SimulatorRequest struct { @@ -154,10 +155,11 @@ func TestAddSimulationModel(t *testing.T) { scenarioID, simulatorID := addScenarioAndSimulator() newSimulationModel := SimulationModelRequest{ - Name: database.SimulationModelA.Name, - ScenarioID: scenarioID, - SimulatorID: simulatorID, - StartParameters: database.SimulationModelA.StartParameters, + Name: database.SimulationModelA.Name, + ScenarioID: scenarioID, + SimulatorID: simulatorID, + StartParameters: database.SimulationModelA.StartParameters, + SelectedModelFileID: database.SimulationModelA.SelectedModelFileID, } // authenticate as normal userB who has no access to new scenario @@ -255,10 +257,11 @@ func TestUpdateSimulationModel(t *testing.T) { // test POST models/ $newSimulationModel newSimulationModel := SimulationModelRequest{ - Name: database.SimulationModelA.Name, - ScenarioID: scenarioID, - SimulatorID: simulatorID, - StartParameters: database.SimulationModelA.StartParameters, + Name: database.SimulationModelA.Name, + ScenarioID: scenarioID, + SimulatorID: simulatorID, + StartParameters: database.SimulationModelA.StartParameters, + SelectedModelFileID: database.SimulationModelA.SelectedModelFileID, } code, resp, err := helper.TestEndpoint(router, token, "/api/models", "POST", helper.KeyModels{"simulationModel": newSimulationModel}) @@ -360,10 +363,11 @@ func TestDeleteSimulationModel(t *testing.T) { scenarioID, simulatorID := addScenarioAndSimulator() newSimulationModel := SimulationModelRequest{ - Name: database.SimulationModelA.Name, - ScenarioID: scenarioID, - SimulatorID: simulatorID, - StartParameters: database.SimulationModelA.StartParameters, + Name: database.SimulationModelA.Name, + ScenarioID: scenarioID, + SimulatorID: simulatorID, + StartParameters: database.SimulationModelA.StartParameters, + SelectedModelFileID: database.SimulationModelA.SelectedModelFileID, } // authenticate as normal user @@ -438,10 +442,11 @@ func TestGetAllSimulationModelsOfScenario(t *testing.T) { // test POST models/ $newSimulationModel newSimulationModel := SimulationModelRequest{ - Name: database.SimulationModelA.Name, - ScenarioID: scenarioID, - SimulatorID: simulatorID, - StartParameters: database.SimulationModelA.StartParameters, + Name: database.SimulationModelA.Name, + ScenarioID: scenarioID, + SimulatorID: simulatorID, + StartParameters: database.SimulationModelA.StartParameters, + SelectedModelFileID: database.SimulationModelA.SelectedModelFileID, } code, resp, err := helper.TestEndpoint(router, token, "/api/models", "POST", helper.KeyModels{"simulationModel": newSimulationModel}) diff --git a/routes/simulationmodel/simulationmodel_validators.go b/routes/simulationmodel/simulationmodel_validators.go index 1e662c1..d8afc4c 100644 --- a/routes/simulationmodel/simulationmodel_validators.go +++ b/routes/simulationmodel/simulationmodel_validators.go @@ -31,16 +31,18 @@ import ( var validate *validator.Validate type validNewSimulationModel struct { - Name string `form:"Name" validate:"required"` - ScenarioID uint `form:"ScenarioID" validate:"required"` - SimulatorID uint `form:"SimulatorID" validate:"required"` - StartParameters postgres.Jsonb `form:"StartParameters" validate:"required"` + Name string `form:"Name" validate:"required"` + ScenarioID uint `form:"ScenarioID" validate:"required"` + SimulatorID uint `form:"SimulatorID" validate:"required"` + StartParameters postgres.Jsonb `form:"StartParameters" validate:"required"` + SelectedModelFileID uint `form:"SelectedModelFilID" validate:"omitempty"` } type validUpdatedSimulationModel struct { - Name string `form:"Name" validate:"omitempty"` - SimulatorID uint `form:"SimulatorID" validate:"omitempty"` - StartParameters postgres.Jsonb `form:"StartParameters" validate:"omitempty"` + Name string `form:"Name" validate:"omitempty"` + SimulatorID uint `form:"SimulatorID" validate:"omitempty"` + StartParameters postgres.Jsonb `form:"StartParameters" validate:"omitempty"` + SelectedModelFileID uint `form:"SelectedModelFileID" validate:"omitempty"` } type addSimulationModelRequest struct { @@ -70,6 +72,7 @@ func (r *addSimulationModelRequest) createSimulationModel() SimulationModel { s.ScenarioID = r.SimulationModel.ScenarioID s.SimulatorID = r.SimulationModel.SimulatorID s.StartParameters = r.SimulationModel.StartParameters + s.SelectedModelFileID = r.SimulationModel.SelectedModelFileID return s } @@ -86,6 +89,10 @@ func (r *updateSimulationModelRequest) updatedSimulationModel(oldSimulationModel s.SimulatorID = r.SimulationModel.SimulatorID } + if r.SimulationModel.SelectedModelFileID != 0 { + s.SelectedModelFileID = r.SimulationModel.SelectedModelFileID + } + // only update Params if not empty var emptyJson postgres.Jsonb // Serialize empty json and params