diff --git a/cmd/actionExecute.go b/cmd/actionExecute.go index d68633f..4a80139 100644 --- a/cmd/actionExecute.go +++ b/cmd/actionExecute.go @@ -1,7 +1,6 @@ package cmd import ( - "encoding/json" "fmt" "log" "time" @@ -91,21 +90,11 @@ func actionExecute() { log.Fatalf("error: failed to get action: %v", err) } - itemJson, err := json.Marshal(item) + newItem, err := core.ExecuteItemAction(item, actionExecuteSource, argv, time.Minute) if err != nil { - log.Fatalf("error: failed to serialize item: %v", err) + log.Fatalf("error executing action: %v", err) } - res, err := core.Execute(actionExecuteSource, argv, nil, string(itemJson), time.Minute) - if err != nil { - log.Fatalf("error: failed to execute action: %v", err) - } - if len(res) != 1 { - log.Fatalf("error: expected action to produce exactly one item, got %d", len(res)) - } - newItem := res[0] - core.BackfillItem(&newItem, &item) - if actionExecuteDiff { if item.Title != newItem.Title { log.Printf("title: %s => %s", item.Title, newItem.Title) @@ -128,7 +117,7 @@ func actionExecute() { } if actionExecuteDryRun { - fmt.Println(formatter(res[0])) + fmt.Println(formatter(newItem)) return } diff --git a/core/action.go b/core/action.go index 7582f54..b10151e 100644 --- a/core/action.go +++ b/core/action.go @@ -6,6 +6,7 @@ import ( "database/sql/driver" "encoding/json" "errors" + "fmt" "io" "log" "os" @@ -206,3 +207,28 @@ func Execute( return items, nil } + +// Execute an action that takes an item as input and returns the item modified. +func ExecuteItemAction( + item Item, + action string, + argv []string, + timeout time.Duration, +) (Item, error) { + itemJson, err := json.Marshal(item) + if err != nil { + return Item{}, fmt.Errorf("failed to serialize item: %v", err) + } + + res, err := Execute(item.Source, argv, nil, string(itemJson), time.Minute) + if err != nil { + return Item{}, fmt.Errorf("failed to execute %s for %s/%s: %v", action, item.Source, item.Id, err) + } + if len(res) != 1 { + return Item{}, fmt.Errorf("expected action to produce exactly one item, got %d", len(res)) + } + newItem := res[0] + BackfillItem(&newItem, &item) + + return newItem, nil +} diff --git a/core/source.go b/core/source.go index 7fb4cb1..37c18b7 100644 --- a/core/source.go +++ b/core/source.go @@ -284,20 +284,10 @@ func UpdateWithFetchedItems(db *DB, source string, items []Item) (int, int, erro if err == nil { var updatedNewItems []Item for _, item := range newItems { - itemJson, err := json.Marshal(item) + updatedItem, err := ExecuteItemAction(item, "on_create", onCreateArgv, time.Minute) if err != nil { - log.Fatalf("error: failed to serialize item: %v", err) + log.Printf("error: %v", err) } - res, err := Execute(source, onCreateArgv, nil, string(itemJson), time.Minute) - if err != nil { - log.Printf("error: failed to execute on_create for %s/%s: %v", item.Source, item.Id, err) - continue - } - if len(res) != 1 { - log.Printf("error: expected on_create for %s/%s to produce exactly one item, got %d", item.Source, item.Id, len(res)) - } - updatedItem := res[0] - BackfillItem(&updatedItem, &item) updatedNewItems = append(updatedNewItems, updatedItem) } UpdateItems(db, updatedNewItems) diff --git a/web/item.go b/web/item.go index c7347fc..76e3a5d 100644 --- a/web/item.go +++ b/web/item.go @@ -1,7 +1,6 @@ package web import ( - "encoding/json" "log" "net/http" "strings" @@ -62,24 +61,12 @@ func (env *Env) doAction(writer http.ResponseWriter, req *http.Request) { return } - itemJson, err := json.Marshal(item) + newItem, err := core.ExecuteItemAction(item, action, argv, time.Minute) if err != nil { http.Error(writer, err.Error(), 500) return } - res, err := core.Execute(source, argv, nil, string(itemJson), time.Minute) - if err != nil { - http.Error(writer, err.Error(), 500) - return - } - if len(res) != 1 { - http.Error(writer, "not exactly one item", 500) - return - } - newItem := res[0] - core.BackfillItem(&newItem, &item) - if err = core.UpdateItems(env.db, []core.Item{newItem}); err != nil { http.Error(writer, err.Error(), 500) return