Files
crawlab/core/routes/router.go
2024-06-14 15:42:50 +08:00

179 lines
5.8 KiB
Go

package routes
import (
"fmt"
"github.com/apex/log"
"github.com/crawlab-team/crawlab/core/controllers"
"github.com/gin-gonic/gin"
"net/http"
"path"
)
type RouterServiceInterface interface {
RegisterControllerToGroup(group *gin.RouterGroup, basePath string, ctr controllers.ListController)
RegisterHandlerToGroup(group *gin.RouterGroup, path string, method string, handler gin.HandlerFunc)
}
type RouterService struct {
app *gin.Engine
}
func NewRouterService(app *gin.Engine) (svc *RouterService) {
return &RouterService{
app: app,
}
}
func (svc *RouterService) RegisterControllerToGroup(group *gin.RouterGroup, basePath string, ctr controllers.BasicController) {
group.GET(basePath, ctr.Get)
group.POST(basePath, ctr.Post)
group.PUT(basePath, ctr.Put)
group.DELETE(basePath, ctr.Delete)
}
func (svc *RouterService) RegisterListControllerToGroup(group *gin.RouterGroup, basePath string, ctr controllers.ListController) {
group.GET(basePath+"/:id", ctr.Get)
group.GET(basePath, ctr.GetList)
group.POST(basePath, ctr.Post)
group.POST(basePath+"/batch", ctr.PostList)
group.PUT(basePath+"/:id", ctr.Put)
group.PUT(basePath, ctr.PutList)
group.DELETE(basePath+"/:id", ctr.Delete)
group.DELETE(basePath, ctr.DeleteList)
}
func (svc *RouterService) RegisterActionControllerToGroup(group *gin.RouterGroup, basePath string, ctr controllers.ActionController) {
for _, action := range ctr.Actions() {
routerPath := path.Join(basePath, action.Path)
switch action.Method {
case http.MethodGet:
group.GET(routerPath, action.HandlerFunc)
case http.MethodPost:
group.POST(routerPath, action.HandlerFunc)
case http.MethodPut:
group.PUT(routerPath, action.HandlerFunc)
case http.MethodDelete:
group.DELETE(routerPath, action.HandlerFunc)
}
}
}
func (svc *RouterService) RegisterListActionControllerToGroup(group *gin.RouterGroup, basePath string, ctr controllers.ListActionController) {
svc.RegisterListControllerToGroup(group, basePath, ctr)
svc.RegisterActionControllerToGroup(group, basePath, ctr)
}
func (svc *RouterService) RegisterHandlerToGroup(group *gin.RouterGroup, path string, method string, handler gin.HandlerFunc) {
switch method {
case http.MethodGet:
group.GET(path, handler)
case http.MethodPost:
group.POST(path, handler)
case http.MethodPut:
group.PUT(path, handler)
case http.MethodDelete:
group.DELETE(path, handler)
default:
log.Warn(fmt.Sprintf("%s is not a valid http method", method))
}
}
func InitRoutes(app *gin.Engine) (err error) {
// routes groups
groups := NewRouterGroups(app)
// router service
svc := NewRouterService(app)
// register routes
registerRoutesAnonymousGroup(svc, groups)
registerRoutesAuthGroup(svc, groups)
registerRoutesFilterGroup(svc, groups)
return nil
}
func registerRoutesAnonymousGroup(svc *RouterService, groups *RouterGroups) {
// login
svc.RegisterActionControllerToGroup(groups.AnonymousGroup, "/", controllers.LoginController)
// version
svc.RegisterActionControllerToGroup(groups.AnonymousGroup, "/version", controllers.VersionController)
// system info
svc.RegisterActionControllerToGroup(groups.AnonymousGroup, "/system-info", controllers.SystemInfoController)
// demo
svc.RegisterActionControllerToGroup(groups.AnonymousGroup, "/demo", controllers.DemoController)
// sync
svc.RegisterActionControllerToGroup(groups.AnonymousGroup, "/sync", controllers.SyncController)
}
func registerRoutesAuthGroup(svc *RouterService, groups *RouterGroups) {
// node
svc.RegisterListControllerToGroup(groups.AuthGroup, "/nodes", controllers.NodeController)
// project
svc.RegisterListControllerToGroup(groups.AuthGroup, "/projects", controllers.ProjectController)
// user
svc.RegisterListActionControllerToGroup(groups.AuthGroup, "/users", controllers.UserController)
// spider
svc.RegisterListActionControllerToGroup(groups.AuthGroup, "/spiders", controllers.SpiderController)
// task
svc.RegisterListActionControllerToGroup(groups.AuthGroup, "/tasks", controllers.TaskController)
// tag
svc.RegisterListControllerToGroup(groups.AuthGroup, "/tags", controllers.TagController)
// setting
svc.RegisterListControllerToGroup(groups.AuthGroup, "/settings", controllers.SettingController)
// data collection
svc.RegisterListControllerToGroup(groups.AuthGroup, "/data/collections", controllers.DataCollectionController)
// result
svc.RegisterActionControllerToGroup(groups.AuthGroup, "/results", controllers.ResultController)
// schedule
svc.RegisterListActionControllerToGroup(groups.AuthGroup, "/schedules", controllers.ScheduleController)
// stats
svc.RegisterActionControllerToGroup(groups.AuthGroup, "/stats", controllers.StatsController)
// token
svc.RegisterListControllerToGroup(groups.AuthGroup, "/tokens", controllers.TokenController)
// git
svc.RegisterListControllerToGroup(groups.AuthGroup, "/gits", controllers.GitController)
// role
svc.RegisterListControllerToGroup(groups.AuthGroup, "/roles", controllers.RoleController)
// permission
svc.RegisterListControllerToGroup(groups.AuthGroup, "/permissions", controllers.PermissionController)
// export
svc.RegisterActionControllerToGroup(groups.AuthGroup, "/export", controllers.ExportController)
// notification
svc.RegisterActionControllerToGroup(groups.AuthGroup, "/notifications", controllers.NotificationController)
// filter
svc.RegisterActionControllerToGroup(groups.AuthGroup, "/filters", controllers.FilterController)
// data sources
svc.RegisterListActionControllerToGroup(groups.AuthGroup, "/data-sources", controllers.DataSourceController)
// environments
svc.RegisterListActionControllerToGroup(groups.AuthGroup, "/environments", controllers.EnvironmentController)
}
func registerRoutesFilterGroup(svc *RouterService, groups *RouterGroups) {
// filer
svc.RegisterActionControllerToGroup(groups.FilerGroup, "", controllers.FilerController)
}