// ActionResource runs custom action on resource func ActionResource(context middleware.Context, dataStore db.DB, identityService middleware.IdentityService, resourceSchema *schema.Schema, action schema.Action, resourceID string, data interface{}, ) error { actionSchema := action.InputSchema context["input"] = data context["id"] = resourceID environmentManager := extension.GetManager() environment, ok := environmentManager.GetEnvironment(resourceSchema.ID) if !ok { return fmt.Errorf("No environment for schema") } if actionSchema != nil { err := resourceSchema.Validate(actionSchema, data) if err != nil { return ResourceError{err, fmt.Sprintf("Validation error: %s", err), WrongData} } } err := extension.HandleEvent(context, environment, action.ID) if err != nil { return err } if _, ok := context["response"]; ok { return nil } return fmt.Errorf("no response") }
// ActionResource runs custom action on resource func ActionResource(context middleware.Context, dataStore db.DB, identityService middleware.IdentityService, resourceSchema *schema.Schema, action schema.Action, resourceID string, data interface{}, ) error { actionSchema := action.InputSchema context["input"] = data context["id"] = resourceID environmentManager := extension.GetManager() environment, ok := environmentManager.GetEnvironment(resourceSchema.ID) if !ok { return fmt.Errorf("No environment for schema") } err := resourceSchema.Validate(actionSchema, data) if err != nil { return ResourceError{err, fmt.Sprintf("Validation error: %s", err), WrongData} } if err := handleEvent(context, environment, fmt.Sprintf("pre_%s", action.ID)); err != nil { return err } if err := InTransaction(context, dataStore, func() error { return handleEvent(context, environment, fmt.Sprintf("pre_%s_in_transaction", action.ID)) }); err != nil { return err } if err := handleEvent(context, environment, action.ID); err != nil { return err } if err := InTransaction(context, dataStore, func() error { return handleEvent(context, environment, fmt.Sprintf("post_%s_in_transaction", action.ID)) }); err != nil { return err } if err := handleEvent(context, environment, fmt.Sprintf("post_%s", action.ID)); err != nil { return err } if rawResponse, ok := context["response"]; ok { if _, ok := rawResponse.(map[string]interface{}); ok { return nil } return fmt.Errorf("extension returned invalid JSON: %v", rawResponse) } return fmt.Errorf("no response") }