// createProject creates a project. func createProject(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { // Request req := &createProjectRequest{} if err := RequestBind(r, req); err != nil { ResponseError(w, ErrBadRequest) return } // Validate if err := models.ValidateProjectName(req.Name); err != nil { ResponseError(w, NewValidationWebError(err)) return } // Save. proj := &models.Project{Name: req.Name} if err := db.Admin.DB().Create(proj).Error; err != nil { sqliteErr, ok := err.(sqlite3.Error) if ok { switch sqliteErr.ExtendedCode { case sqlite3.ErrConstraintNotNull: ResponseError(w, ErrNotNull) return case sqlite3.ErrConstraintPrimaryKey: ResponseError(w, ErrPrimaryKey) return case sqlite3.ErrConstraintUnique: ResponseError(w, ErrDuplicateProjectName) return } } ResponseError(w, NewUnexceptedWebError(err)) return } ResponseJSONOK(w, proj) }
// updateProject updates a project. func updateProject(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { // Params id, err := strconv.Atoi(ps.ByName("id")) if err != nil { ResponseError(w, ErrProjectID) return } // Request req := &updateProjectRequest{} if err := RequestBind(r, req); err != nil { ResponseError(w, ErrBadRequest) return } // Validate if err := models.ValidateProjectName(req.Name); err != nil { ResponseError(w, NewValidationWebError(err)) return } // Find proj := &models.Project{} if err := db.Admin.DB().First(proj, id).Error; err != nil { switch err { case gorm.RecordNotFound: ResponseError(w, ErrProjectNotFound) return default: ResponseError(w, NewUnexceptedWebError(err)) return } } // Patch. proj.Name = req.Name if err := db.Admin.DB().Save(proj).Error; err != nil { if err == gorm.RecordNotFound { // Not found. ResponseError(w, ErrProjectNotFound) return } // Writer errors. sqliteErr, ok := err.(sqlite3.Error) if ok { switch sqliteErr.ExtendedCode { case sqlite3.ErrConstraintNotNull: ResponseError(w, ErrNotNull) return case sqlite3.ErrConstraintUnique: ResponseError(w, ErrDuplicateProjectName) return } } ResponseError(w, NewUnexceptedWebError(err)) return } ResponseJSONOK(w, proj) }
// Migrate projects. // // 1. Fetch all projects from belldb. // 2. Create the project into bansheedb. // 3. Create the rules for each project. // func migrateProjects() { var projs []Project // Fetch all projects from belldb. if err := bellDB.Find(&projs).Error; err != nil { log.Fatal("fetch all projects from %s: %v", *bellDBFileName, err) } for _, proj := range projs { // Create banshee project. if err := models.ValidateProjectName(proj.Name); err != nil { log.Warn("project %s: %v, skipping..", proj.Name, err) continue } p := &models.Project{Name: proj.Name} if err := bansheeDB.Create(p).Error; err != nil { sqliteErr, ok := err.(sqlite3.Error) if ok && sqliteErr.ExtendedCode == sqlite3.ErrConstraintUnique { log.Warn("project %s already in %s, skipping..", p.Name, *bansheeDBFileName) } else { log.Fatal("cannot create project %s: %v", p.Name, err) } } // Fetch its rules from belldb. var rules []Rule if err := bellDB.Model(proj).Related(&rules).Error; err != nil { log.Fatal("cannot fetch rules for %s: %v", p.Name, err) } for _, rule := range rules { // Create banshee rule. if err := models.ValidateRulePattern(rule.Pattern); err != nil { log.Warn("rule %s: %v, belongs to %s, skippig..", rule.Pattern, err, proj.Name) continue } r := &models.Rule{ Pattern: rule.Pattern, ProjectID: p.ID, TrendUp: rule.Up, TrendDown: rule.Down, // Important: max and min for bell is reversed with banshee's. ThresholdMax: rule.Min, ThresholdMin: rule.Max, } if err := bansheeDB.Create(r).Error; err != nil { sqliteErr, ok := err.(sqlite3.Error) if ok && sqliteErr.ExtendedCode == sqlite3.ErrConstraintUnique { log.Warn("rule %s already in %s, skipping..", r.Pattern, *bansheeDBFileName) } else { log.Fatal("cannot create rule %s: %v", r.Pattern, err) } } } } }