added support for passing more than one id in the Hook.Unbind method for consistency with the router

This commit is contained in:
Gani Georgiev 2024-11-26 11:52:26 +02:00
parent 0ac4a388c0
commit f1b199b35c
3 changed files with 17 additions and 9 deletions

View File

@ -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 ## v0.23.1
- Added `RequestEvent.Blob(status, contentType, bytes)` response write helper ([#5940](https://github.com/pocketbase/pocketbase/discussions/5940)). - Added `RequestEvent.Blob(status, contentType, bytes)` response write helper ([#5940](https://github.com/pocketbase/pocketbase/discussions/5940)).

View File

@ -112,17 +112,19 @@ func (h *Hook[T]) BindFunc(fn func(e T) error) string {
return h.Bind(&Handler[T]{Func: fn}) return h.Bind(&Handler[T]{Func: fn})
} }
// Unbind removes a single hook handler by its id. // Unbind removes one or many hook handler by their id.
func (h *Hook[T]) Unbind(id string) { func (h *Hook[T]) Unbind(idsToRemove ...string) {
h.mu.Lock() h.mu.Lock()
defer h.mu.Unlock() defer h.mu.Unlock()
for _, id := range idsToRemove {
for i := len(h.handlers) - 1; i >= 0; i-- { for i := len(h.handlers) - 1; i >= 0; i-- {
if h.handlers[i].Id == id { if h.handlers[i].Id == id {
h.handlers = append(h.handlers[:i], h.handlers[i+1:]...) 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 break // for now stop on the first occurrence since we don't allow handlers with duplicated ids
} }
} }
}
} }
// UnbindAll removes all registered handlers. // UnbindAll removes all registered handlers.

View File

@ -70,6 +70,7 @@ func TestHookUnbind(t *testing.T) {
calls := "" 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() }) id1 := h.BindFunc(func(e *Event) error { calls += "1"; return e.Next() })
h.BindFunc(func(e *Event) error { calls += "2"; return e.Next() }) h.BindFunc(func(e *Event) error { calls += "2"; return e.Next() })
h.Bind(&Handler[*Event]{ h.Bind(&Handler[*Event]{
@ -78,11 +79,11 @@ func TestHookUnbind(t *testing.T) {
h.Unbind("missing") // should do nothing and not panic h.Unbind("missing") // should do nothing and not panic
if total := len(h.handlers); total != 3 { if total := len(h.handlers); total != 4 {
t.Fatalf("Expected %d handlers, got %d", 3, total) t.Fatalf("Expected %d handlers, got %d", 4, total)
} }
h.Unbind(id1) h.Unbind(id1, id0)
if total := len(h.handlers); total != 2 { if total := len(h.handlers); total != 2 {
t.Fatalf("Expected %d handlers, got %d", 2, total) t.Fatalf("Expected %d handlers, got %d", 2, total)