// UpdateResourceInTransaction updates resource in db in transaction func UpdateResourceInTransaction( context middleware.Context, resourceSchema *schema.Schema, resourceID string, dataMap map[string]interface{}, tenantIDs []string) error { manager := schema.GetManager() mainTransaction := context["transaction"].(transaction.Transaction) environmentManager := extension.GetManager() environment, ok := environmentManager.GetEnvironment(resourceSchema.ID) if !ok { return fmt.Errorf("No environment for schema") } resource, err := mainTransaction.Fetch( resourceSchema, resourceID, tenantIDs) if err != nil { return ResourceError{err, err.Error(), WrongQuery} } err = resource.Update(dataMap) if err != nil { return ResourceError{err, err.Error(), WrongData} } context["resource"] = resource.Data() if err := handleEvent(context, environment, "pre_update_in_transaction"); err != nil { return err } dataMap, ok = context["resource"].(map[string]interface{}) if !ok { return fmt.Errorf("Resource not JSON: %s", err) } resource, err = manager.LoadResource(resourceSchema.ID, dataMap) if err != nil { return fmt.Errorf("Loading Resource failed: %s", err) } err = mainTransaction.Update(resource) if err != nil { return ResourceError{err, fmt.Sprintf("Failed to store data in database: %v", err), UpdateFailed} } resourceSchema.HandleUpdate(resource) response := map[string]interface{}{} response[resourceSchema.Singular] = resource.Data() context["response"] = response if err := handleEvent(context, environment, "post_update_in_transaction"); err != nil { return err } return nil }