From 6346140de5923ff193149e74ebb3a93d793997dc Mon Sep 17 00:00:00 2001 From: Jonas Plum Date: Thu, 19 Sep 2024 23:23:45 +0200 Subject: [PATCH] fix: multiple hooks (#1101) --- Makefile | 2 +- go.mod | 1 + go.sum | 2 ++ reaction/trigger/hook/hook.go | 31 +++++++++++++++++++------------ 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 5bf7490..694d6c8 100644 --- a/Makefile +++ b/Makefile @@ -57,6 +57,6 @@ dev-10000: go run . fake-data --users 100 --tickets 10000 go run . serve -.PHONY: dev-ui +.PHONY: serve-ui serve-ui: cd ui && bun dev --port 3000 diff --git a/go.mod b/go.mod index d8ffe57..5061043 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.9.0 github.com/tidwall/sjson v1.2.5 + go.uber.org/multierr v1.11.0 ) require ( diff --git a/go.sum b/go.sum index 75b8b54..16c7399 100644 --- a/go.sum +++ b/go.sum @@ -229,6 +229,8 @@ go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM= go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= gocloud.dev v0.37.0 h1:XF1rN6R0qZI/9DYjN16Uy0durAmSlf58DHOcb28GPro= gocloud.dev v0.37.0/go.mod h1:7/O4kqdInCNsc6LqgmuFnS0GRew4XNNYWpA44yQnwco= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= diff --git a/reaction/trigger/hook/hook.go b/reaction/trigger/hook/hook.go index 6058ef2..d5a0985 100644 --- a/reaction/trigger/hook/hook.go +++ b/reaction/trigger/hook/hook.go @@ -14,6 +14,7 @@ import ( "github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/daos" "github.com/pocketbase/pocketbase/models" + "go.uber.org/multierr" "github.com/SecurityBrewery/catalyst/migrations" "github.com/SecurityBrewery/catalyst/reaction/action" @@ -70,43 +71,49 @@ func runHook(ctx context.Context, app core.App, collection, event string, record return fmt.Errorf("failed to marshal webhook payload: %w", err) } - hook, found, err := findByHookTrigger(app.Dao(), collection, event) + hooks, err := findByHookTrigger(app.Dao(), collection, event) if err != nil { return fmt.Errorf("failed to find hook by trigger: %w", err) } - if !found { + if len(hooks) == 0 { return nil } - _, err = action.Run(ctx, app, hook.GetString("action"), hook.GetString("actiondata"), string(payload)) - if err != nil { - return fmt.Errorf("failed to run hook reaction: %w", err) + var errs error + + for _, hook := range hooks { + _, err = action.Run(ctx, app, hook.GetString("action"), hook.GetString("actiondata"), string(payload)) + if err != nil { + errs = multierr.Append(errs, fmt.Errorf("failed to run hook reaction: %w", err)) + } } - return nil + return errs } -func findByHookTrigger(dao *daos.Dao, collection, event string) (*models.Record, bool, error) { +func findByHookTrigger(dao *daos.Dao, collection, event string) ([]*models.Record, error) { records, err := dao.FindRecordsByExpr(migrations.ReactionCollectionName, dbx.HashExp{"trigger": "hook"}) if err != nil { - return nil, false, fmt.Errorf("failed to find hook reaction: %w", err) + return nil, fmt.Errorf("failed to find hook reaction: %w", err) } if len(records) == 0 { - return nil, false, nil + return nil, nil } + var matchedRecords []*models.Record + for _, record := range records { var hook Hook if err := json.Unmarshal([]byte(record.GetString("triggerdata")), &hook); err != nil { - return nil, false, err + return nil, err } if slices.Contains(hook.Collections, collection) && slices.Contains(hook.Events, event) { - return record, true, nil + matchedRecords = append(matchedRecords, record) } } - return nil, false, nil + return matchedRecords, nil }