Factor out ExecuteItemAction helper
This commit is contained in:
parent
7bea8c247a
commit
34fa784c44
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
|
15
web/item.go
15
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
|
||||
|
Loading…
Reference in New Issue
Block a user