From f1b199b35c128da01a31187d1bcc5e98b7d5c51d Mon Sep 17 00:00:00 2001 From: Gani Georgiev Date: Tue, 26 Nov 2024 11:52:26 +0200 Subject: [PATCH] added support for passing more than one id in the Hook.Unbind method for consistency with the router --- CHANGELOG.md | 5 +++++ tools/hook/hook.go | 14 ++++++++------ tools/hook/hook_test.go | 7 ++++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ccc9762..e5f3acbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## (WIP) + +- Added support for passing more than one id in the `Hook.Unbind` method for consistency with the router. + + ## v0.23.1 - Added `RequestEvent.Blob(status, contentType, bytes)` response write helper ([#5940](https://github.com/pocketbase/pocketbase/discussions/5940)). diff --git a/tools/hook/hook.go b/tools/hook/hook.go index f3ea1d30..722ed9f2 100644 --- a/tools/hook/hook.go +++ b/tools/hook/hook.go @@ -112,15 +112,17 @@ func (h *Hook[T]) BindFunc(fn func(e T) error) string { return h.Bind(&Handler[T]{Func: fn}) } -// Unbind removes a single hook handler by its id. -func (h *Hook[T]) Unbind(id string) { +// Unbind removes one or many hook handler by their id. +func (h *Hook[T]) Unbind(idsToRemove ...string) { h.mu.Lock() defer h.mu.Unlock() - for i := len(h.handlers) - 1; i >= 0; i-- { - if h.handlers[i].Id == id { - h.handlers = append(h.handlers[:i], h.handlers[i+1:]...) - break // for now stop on the first occurrence since we don't allow handlers with duplicated ids + for _, id := range idsToRemove { + for i := len(h.handlers) - 1; i >= 0; i-- { + if h.handlers[i].Id == id { + h.handlers = append(h.handlers[:i], h.handlers[i+1:]...) + break // for now stop on the first occurrence since we don't allow handlers with duplicated ids + } } } } diff --git a/tools/hook/hook_test.go b/tools/hook/hook_test.go index 5bbac5e6..36bd945f 100644 --- a/tools/hook/hook_test.go +++ b/tools/hook/hook_test.go @@ -70,6 +70,7 @@ func TestHookUnbind(t *testing.T) { calls := "" + id0 := h.BindFunc(func(e *Event) error { calls += "0"; return e.Next() }) id1 := h.BindFunc(func(e *Event) error { calls += "1"; return e.Next() }) h.BindFunc(func(e *Event) error { calls += "2"; return e.Next() }) h.Bind(&Handler[*Event]{ @@ -78,11 +79,11 @@ func TestHookUnbind(t *testing.T) { h.Unbind("missing") // should do nothing and not panic - if total := len(h.handlers); total != 3 { - t.Fatalf("Expected %d handlers, got %d", 3, total) + if total := len(h.handlers); total != 4 { + t.Fatalf("Expected %d handlers, got %d", 4, total) } - h.Unbind(id1) + h.Unbind(id1, id0) if total := len(h.handlers); total != 2 { t.Fatalf("Expected %d handlers, got %d", 2, total)