func (c *controllerAPI) PutResource(ctx context.Context, w http.ResponseWriter, req *http.Request) { params, _ := ctxhelper.ParamsFromContext(ctx) p, err := c.getProvider(ctx) if err != nil { respondWithError(w, err) return } var resource ct.Resource if err = httphelper.DecodeJSON(req, &resource); err != nil { respondWithError(w, err) return } resource.ID = params.ByName("resources_id") resource.ProviderID = p.ID if err := schema.Validate(resource); err != nil { respondWithError(w, err) return } if err := c.resourceRepo.Add(&resource); err != nil { respondWithError(w, err) return } httphelper.JSON(w, 200, &resource) }
func putResource(p *ct.Provider, params martini.Params, resource ct.Resource, repo *ResourceRepo, r ResponseHelper) { resource.ID = params["resources_id"] resource.ProviderID = p.ID if err := repo.Add(&resource); err != nil { r.Error(err) return } r.JSON(200, &resource) }
func (rr *ResourceRepo) Add(r *ct.Resource) error { if r.ID == "" { r.ID = random.UUID() } tx, err := rr.db.Begin() if err != nil { return err } err = tx.QueryRow(`INSERT INTO resources (resource_id, provider_id, external_id, env) VALUES ($1, $2, $3, $4) RETURNING created_at`, r.ID, r.ProviderID, r.ExternalID, envHstore(r.Env)).Scan(&r.CreatedAt) if err != nil { tx.Rollback() return err } for i, appID := range r.Apps { var filterSQL string var args []interface{} if idPattern.MatchString(appID) { filterSQL = "app_id = $1 OR name = $2), $3)" args = []interface{}{appID, appID, r.ID} } else { filterSQL = "name = $1), $2)" args = []interface{}{appID, r.ID} } err = tx.QueryRow("INSERT INTO app_resources (app_id, resource_id) VALUES ((SELECT app_id FROM apps WHERE "+ filterSQL+" RETURNING app_id", args...).Scan(&r.Apps[i]) if err != nil { tx.Rollback() return err } r.Apps[i] = cleanUUID(r.Apps[i]) } r.ID = cleanUUID(r.ID) return tx.Commit() }
func (rr *ResourceRepo) Add(r *ct.Resource) error { if r.ID == "" { r.ID = random.UUID() } tx, err := rr.db.Begin() if err != nil { return err } err = tx.QueryRow("resource_insert", r.ID, r.ProviderID, r.ExternalID, r.Env).Scan(&r.CreatedAt) if err != nil { tx.Rollback() return err } for i, appID := range r.Apps { var row postgres.Scanner if idPattern.MatchString(appID) { row = tx.QueryRow("app_resource_insert_app_by_name_or_id", appID, appID, r.ID) } else { row = tx.QueryRow("app_resource_insert_app_by_name", appID, r.ID) } if err := row.Scan(&r.Apps[i]); err != nil { tx.Rollback() return err } } for _, appID := range r.Apps { if err := createEvent(tx.Exec, &ct.Event{ AppID: appID, ObjectID: r.ID, ObjectType: ct.EventTypeResource, }, r); err != nil { tx.Rollback() return err } } if len(r.Apps) == 0 { // Ensure an event is created if there are no associated apps if err := createEvent(tx.Exec, &ct.Event{ ObjectID: r.ID, ObjectType: ct.EventTypeResource, }, r); err != nil { tx.Rollback() return err } } return tx.Commit() }