fix: multiple hooks (#1101)

This commit is contained in:
Jonas Plum
2024-09-19 23:23:45 +02:00
committed by GitHub
parent d7bdf1d276
commit 6346140de5
4 changed files with 23 additions and 13 deletions

View File

@@ -57,6 +57,6 @@ dev-10000:
go run . fake-data --users 100 --tickets 10000 go run . fake-data --users 100 --tickets 10000
go run . serve go run . serve
.PHONY: dev-ui .PHONY: serve-ui
serve-ui: serve-ui:
cd ui && bun dev --port 3000 cd ui && bun dev --port 3000

1
go.mod
View File

@@ -11,6 +11,7 @@ require (
github.com/spf13/cobra v1.8.1 github.com/spf13/cobra v1.8.1
github.com/stretchr/testify v1.9.0 github.com/stretchr/testify v1.9.0
github.com/tidwall/sjson v1.2.5 github.com/tidwall/sjson v1.2.5
go.uber.org/multierr v1.11.0
) )
require ( require (

2
go.sum
View File

@@ -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/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 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM=
go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= 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 h1:XF1rN6R0qZI/9DYjN16Uy0durAmSlf58DHOcb28GPro=
gocloud.dev v0.37.0/go.mod h1:7/O4kqdInCNsc6LqgmuFnS0GRew4XNNYWpA44yQnwco= 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= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=

View File

@@ -14,6 +14,7 @@ import (
"github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/daos" "github.com/pocketbase/pocketbase/daos"
"github.com/pocketbase/pocketbase/models" "github.com/pocketbase/pocketbase/models"
"go.uber.org/multierr"
"github.com/SecurityBrewery/catalyst/migrations" "github.com/SecurityBrewery/catalyst/migrations"
"github.com/SecurityBrewery/catalyst/reaction/action" "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) 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 { if err != nil {
return fmt.Errorf("failed to find hook by trigger: %w", err) return fmt.Errorf("failed to find hook by trigger: %w", err)
} }
if !found { if len(hooks) == 0 {
return nil return nil
} }
_, err = action.Run(ctx, app, hook.GetString("action"), hook.GetString("actiondata"), string(payload)) var errs error
if err != nil {
return fmt.Errorf("failed to run hook reaction: %w", err) 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"}) records, err := dao.FindRecordsByExpr(migrations.ReactionCollectionName, dbx.HashExp{"trigger": "hook"})
if err != nil { 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 { if len(records) == 0 {
return nil, false, nil return nil, nil
} }
var matchedRecords []*models.Record
for _, record := range records { for _, record := range records {
var hook Hook var hook Hook
if err := json.Unmarshal([]byte(record.GetString("triggerdata")), &hook); err != nil { 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) { 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
} }