b6d0c89aa1
Co-authored-by: multica-agent <github@multica.ai>
73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package rest
|
|
|
|
import "github.com/gin-gonic/gin"
|
|
|
|
type Middleware = gin.HandlerFunc
|
|
|
|
type Route struct {
|
|
Method string
|
|
Path string
|
|
Handler gin.HandlerFunc
|
|
Middlewares []Middleware
|
|
}
|
|
|
|
type RouteOption func(*routeOptions)
|
|
|
|
type routeOptions struct {
|
|
prefix string
|
|
}
|
|
|
|
type Server struct {
|
|
router *gin.Engine
|
|
optionalAuth Middleware
|
|
}
|
|
|
|
type ServerOption func(*Server)
|
|
|
|
func NewServer(router *gin.Engine, opts ...ServerOption) *Server {
|
|
server := &Server{router: router}
|
|
for _, opt := range opts {
|
|
opt(server)
|
|
}
|
|
return server
|
|
}
|
|
|
|
func WithOptionalAuth(middleware Middleware) ServerOption {
|
|
return func(server *Server) {
|
|
server.optionalAuth = middleware
|
|
}
|
|
}
|
|
|
|
func WithMiddlewares(middlewares []Middleware, routes ...Route) []Route {
|
|
for i := range routes {
|
|
routes[i].Middlewares = append(routes[i].Middlewares, middlewares...)
|
|
}
|
|
return routes
|
|
}
|
|
|
|
func WithPrefix(prefix string) RouteOption {
|
|
return func(opts *routeOptions) {
|
|
opts.prefix = prefix
|
|
}
|
|
}
|
|
|
|
func WithJwt(_ string) RouteOption {
|
|
return func(_ *routeOptions) {}
|
|
}
|
|
|
|
func (server *Server) AddRoutes(routes []Route, opts ...RouteOption) {
|
|
options := routeOptions{}
|
|
for _, opt := range opts {
|
|
opt(&options)
|
|
}
|
|
|
|
for _, route := range routes {
|
|
handlers := append([]gin.HandlerFunc{}, route.Middlewares...)
|
|
if server.optionalAuth != nil && options.prefix == "/v1/public/subscribe" && route.Path == "/list" && len(handlers) > 0 {
|
|
handlers[0] = server.optionalAuth
|
|
}
|
|
handlers = append(handlers, route.Handler)
|
|
server.router.Handle(route.Method, options.prefix+route.Path, handlers...)
|
|
}
|
|
}
|