1
0
mirror of https://github.com/pocketbase/pocketbase.git synced 2025-03-18 21:57:50 +02:00
2024-10-14 14:33:04 +03:00

74 lines
2.2 KiB
Go

package router
import "github.com/pocketbase/pocketbase/tools/hook"
type Route[T hook.Resolver] struct {
excludedMiddlewares map[string]struct{}
Action func(e T) error
Method string
Path string
Middlewares []*hook.Handler[T]
}
// BindFunc registers one or multiple middleware functions to the current route.
//
// The registered middleware functions are "anonymous" and with default priority,
// aka. executes in the order they were registered.
//
// If you need to specify a named middleware (ex. so that it can be removed)
// or middleware with custom exec prirority, use the [Route.Bind] method.
func (route *Route[T]) BindFunc(middlewareFuncs ...func(e T) error) *Route[T] {
for _, m := range middlewareFuncs {
route.Middlewares = append(route.Middlewares, &hook.Handler[T]{Func: m})
}
return route
}
// Bind registers one or multiple middleware handlers to the current route.
func (route *Route[T]) Bind(middlewares ...*hook.Handler[T]) *Route[T] {
route.Middlewares = append(route.Middlewares, middlewares...)
// unmark the newly added middlewares in case they were previously "excluded"
if route.excludedMiddlewares != nil {
for _, m := range middlewares {
if m.Id != "" {
delete(route.excludedMiddlewares, m.Id)
}
}
}
return route
}
// Unbind removes one or more middlewares with the specified id(s) from the current route.
//
// It also adds the removed middleware ids to an exclude list so that they could be skipped from
// the execution chain in case the middleware is registered in a parent group.
//
// Anonymous middlewares are considered non-removable, aka. this method
// does nothing if the middleware id is an empty string.
func (route *Route[T]) Unbind(middlewareIds ...string) *Route[T] {
for _, middlewareId := range middlewareIds {
if middlewareId == "" {
continue
}
// remove from the route's middlewares
for i := len(route.Middlewares) - 1; i >= 0; i-- {
if route.Middlewares[i].Id == middlewareId {
route.Middlewares = append(route.Middlewares[:i], route.Middlewares[i+1:]...)
}
}
// add to the exclude list
if route.excludedMiddlewares == nil {
route.excludedMiddlewares = map[string]struct{}{}
}
route.excludedMiddlewares[middlewareId] = struct{}{}
}
return route
}