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