Factor out ExecuteItemAction helper

This commit is contained in:
Tim Van Baak 2025-01-29 23:14:00 -08:00
parent 7bea8c247a
commit 34fa784c44
4 changed files with 32 additions and 40 deletions

View File

@ -1,7 +1,6 @@
package cmd package cmd
import ( import (
"encoding/json"
"fmt" "fmt"
"log" "log"
"time" "time"
@ -91,21 +90,11 @@ func actionExecute() {
log.Fatalf("error: failed to get action: %v", err) 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 { 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 actionExecuteDiff {
if item.Title != newItem.Title { if item.Title != newItem.Title {
log.Printf("title: %s => %s", item.Title, newItem.Title) log.Printf("title: %s => %s", item.Title, newItem.Title)
@ -128,7 +117,7 @@ func actionExecute() {
} }
if actionExecuteDryRun { if actionExecuteDryRun {
fmt.Println(formatter(res[0])) fmt.Println(formatter(newItem))
return return
} }

View File

@ -6,6 +6,7 @@ import (
"database/sql/driver" "database/sql/driver"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"io" "io"
"log" "log"
"os" "os"
@ -206,3 +207,28 @@ func Execute(
return items, nil 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
}

View File

@ -284,20 +284,10 @@ func UpdateWithFetchedItems(db *DB, source string, items []Item) (int, int, erro
if err == nil { if err == nil {
var updatedNewItems []Item var updatedNewItems []Item
for _, item := range newItems { for _, item := range newItems {
itemJson, err := json.Marshal(item) updatedItem, err := ExecuteItemAction(item, "on_create", onCreateArgv, time.Minute)
if err != nil { 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) updatedNewItems = append(updatedNewItems, updatedItem)
} }
UpdateItems(db, updatedNewItems) UpdateItems(db, updatedNewItems)

View File

@ -1,7 +1,6 @@
package web package web
import ( import (
"encoding/json"
"log" "log"
"net/http" "net/http"
"strings" "strings"
@ -62,24 +61,12 @@ func (env *Env) doAction(writer http.ResponseWriter, req *http.Request) {
return return
} }
itemJson, err := json.Marshal(item) newItem, err := core.ExecuteItemAction(item, action, argv, time.Minute)
if err != nil { if err != nil {
http.Error(writer, err.Error(), 500) http.Error(writer, err.Error(), 500)
return 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 { if err = core.UpdateItems(env.db, []core.Item{newItem}); err != nil {
http.Error(writer, err.Error(), 500) http.Error(writer, err.Error(), 500)
return return