in backend/server/services/project.go [196:323]
func PatchProject(name string, body map[string]interface{}) (*models.ApiOutputProject, errors.Error) {
projectInput := &models.ApiInputProject{}
// load input
err := helper.DecodeMapStruct(body, projectInput, true)
if err != nil {
return nil, err
}
// wrap all operation inside a transaction
tx := db.Begin()
defer func() {
if r := recover(); r != nil || err != nil {
err = tx.Rollback()
if err != nil {
logger.Error(err, "PatchProject: failed to rollback")
}
}
}()
project, err := getProjectByName(tx, name, dal.Lock(true, false))
if err != nil {
return nil, err
}
// allowed to changed the name
if projectInput.Name == "" {
projectInput.Name = name
}
project.BaseProject = projectInput.BaseProject
// name changed, updates the related entities as well
if name != project.Name {
// ProjectMetric
err = tx.UpdateColumn(
&models.ProjectMetricSetting{},
"project_name", project.Name,
dal.Where("project_name = ?", name),
)
if err != nil {
return nil, err
}
// ProjectPrMetric
err = tx.UpdateColumn(
&crossdomain.ProjectPrMetric{},
"project_name", project.Name,
dal.Where("project_name = ?", name),
)
if err != nil {
return nil, err
}
// ProjectIncidentDeploymentRelationship
err = tx.UpdateColumn(
&crossdomain.ProjectIncidentDeploymentRelationship{},
"project_name", project.Name,
dal.Where("project_name = ?", name),
)
if err != nil {
return nil, err
}
// ProjectMapping
err = tx.UpdateColumn(
&crossdomain.ProjectMapping{},
"project_name", project.Name,
dal.Where("project_name = ?", name),
)
if err != nil {
return nil, err
}
// Blueprint
err = tx.UpdateColumn(
&models.Blueprint{},
"project_name", project.Name,
dal.Where("project_name = ?", name),
)
if err != nil {
return nil, err
}
if projectService != nil {
if err := projectService.RenameProject(tx, name, project.Name); err != nil {
return nil, err
}
}
// rename project
err = tx.UpdateColumn(
&models.Project{},
"name", project.Name,
dal.Where("name = ?", name),
)
}
// Blueprint
// err = tx.UpdateColumn(
// &models.Blueprint{},
// "enable", projectInput.Enable,
// dal.Where("project_name = ?", name),
// )
// if err != nil {
// return nil, err
// }
// refresh project metrics if needed
if len(projectInput.Metrics) > 0 {
err = refreshProjectMetrics(tx, projectInput)
if err != nil {
return nil, err
}
}
// update project itself
err = tx.Update(project)
if err != nil {
return nil, err
}
// commit the transaction
err = tx.Commit()
if err != nil {
return nil, err
}
// all good, render output
return makeProjectOutput(project, false)
}