func (r *AppRepo) Add(data interface{}) error { app := data.(*ct.App) if app.Name == "" { return ct.ValidationError{"name", "must not be blank"} } if len(app.Name) > 30 || !appNamePattern.MatchString(app.Name) { return ct.ValidationError{"name", "is invalid"} } if app.ID == "" { app.ID = utils.UUID() } var meta hstore.Hstore if len(app.Meta) > 0 { meta.Map = make(map[string]sql.NullString, len(app.Meta)) for k, v := range app.Meta { meta.Map[k] = sql.NullString{String: v, Valid: true} } } err := r.db.QueryRow("INSERT INTO apps (app_id, name, protected, meta) VALUES ($1, $2, $3, $4) RETURNING created_at, updated_at", app.ID, app.Name, app.Protected, meta).Scan(&app.CreatedAt, &app.UpdatedAt) app.ID = cleanUUID(app.ID) if !app.Protected && r.defaultDomain != "" { route := (&strowger.HTTPRoute{ Domain: fmt.Sprintf("%s.%s", app.Name, r.defaultDomain), Service: app.Name + "-web", }).ToRoute() route.ParentRef = routeParentRef(app) if err := r.router.CreateRoute(route); err != nil { log.Printf("Error creating default route for %s: %s", app.Name, err) } } return err }
func (r *AppRepo) Update(id string, data map[string]interface{}) (interface{}, error) { tx, err := r.db.Begin() if err != nil { return nil, err } app, err := selectApp(tx, id, true) if err != nil { tx.Rollback() return nil, err } for k, v := range data { switch k { case "strategy": strategy, ok := v.(string) if !ok { tx.Rollback() return nil, fmt.Errorf("controller: expected string, got %T", v) } app.Strategy = strategy if _, err := tx.Exec("UPDATE apps SET strategy = $2, updated_at = now() WHERE app_id = $1", app.ID, app.Strategy); err != nil { tx.Rollback() return nil, err } case "meta": data, ok := v.(map[string]interface{}) if !ok { tx.Rollback() return nil, fmt.Errorf("controller: expected map[string]interface{}, got %T", v) } var meta hstore.Hstore meta.Map = make(map[string]sql.NullString, len(data)) app.Meta = make(map[string]string, len(data)) for k, v := range data { s, ok := v.(string) if !ok { tx.Rollback() return nil, fmt.Errorf("controller: expected string, got %T", v) } meta.Map[k] = sql.NullString{String: s, Valid: true} app.Meta[k] = s } if _, err := tx.Exec("UPDATE apps SET meta = $2, updated_at = now() WHERE app_id = $1", app.ID, meta); err != nil { tx.Rollback() return nil, err } } } if err := createEvent(tx.Exec, &ct.Event{ AppID: app.ID, ObjectID: app.ID, ObjectType: ct.EventTypeApp, }, app); err != nil { tx.Rollback() return nil, err } return app, tx.Commit() }
func metaToHstore(m map[string]string) hstore.Hstore { var s hstore.Hstore if len(m) > 0 { s.Map = make(map[string]sql.NullString, len(m)) for k, v := range m { s.Map[k] = sql.NullString{String: v, Valid: true} } } return s }
func (r *AppRepo) Update(id string, data map[string]interface{}) (interface{}, error) { tx, err := r.db.Begin() if err != nil { return nil, err } app, err := selectApp(tx, id, true) if err != nil { tx.Rollback() return nil, err } for k, v := range data { switch k { case "protected": protected, ok := v.(bool) if !ok { tx.Rollback() return nil, fmt.Errorf("controller: expected bool, got %T", v) } if app.Protected != protected { if _, err := tx.Exec("UPDATE apps SET protected = $2, updated_at = now() WHERE app_id = $1", app.ID, protected); err != nil { tx.Rollback() return nil, err } app.Protected = protected } case "meta": data, ok := v.(map[string]interface{}) if !ok { tx.Rollback() return nil, fmt.Errorf("controller: expected map[string]interface{}, got %T", v) } var meta hstore.Hstore meta.Map = make(map[string]sql.NullString, len(data)) app.Meta = make(map[string]string, len(data)) for k, v := range data { s, ok := v.(string) if !ok { tx.Rollback() return nil, fmt.Errorf("controller: expected string, got %T", v) } meta.Map[k] = sql.NullString{String: s, Valid: true} app.Meta[k] = s } if _, err := tx.Exec("UPDATE apps SET meta = $2, updated_at = now() WHERE app_id = $1", app.ID, meta); err != nil { tx.Rollback() return nil, err } } } return app, tx.Commit() }