Files
sub-store/internal/handler/routes.go
T
2026-07-28 10:32:21 +08:00

120 lines
4.0 KiB
Go

package handler
import (
"github.com/gofiber/fiber/v3"
"github.com/jmoiron/sqlx"
"github.com/peterqiu0516/sub-store/internal/config"
"github.com/peterqiu0516/sub-store/internal/database"
"github.com/peterqiu0516/sub-store/internal/middleware"
)
// Deps holds all shared dependencies for handlers.
type Deps struct {
Cfg *config.Config
DB *sqlx.DB
SourceRepo *database.SourceRepo
CollectionRepo *database.CollectionRepo
TemplateRepo *database.TemplateRepo
SettingsRepo *database.SettingsRepo
RecycleRepo *database.RecycleRepo
CacheRepo *database.CacheRepo
}
func NewDeps(cfg *config.Config, db *sqlx.DB) *Deps {
return &Deps{
Cfg: cfg,
DB: db,
SourceRepo: database.NewSourceRepo(db),
CollectionRepo: database.NewCollectionRepo(db),
TemplateRepo: database.NewTemplateRepo(db),
SettingsRepo: database.NewSettingsRepo(db),
RecycleRepo: database.NewRecycleRepo(db),
CacheRepo: database.NewCacheRepo(db),
}
}
// RegisterRoutes registers all API and download routes.
func RegisterRoutes(app *fiber.App, cfg *config.Config, db *sqlx.DB) {
deps := NewDeps(cfg, db)
// Admin API group — requires admin token
api := app.Group("/api",
middleware.RequireAdmin(cfg.Auth.AdminToken),
middleware.BodyLimit(cfg.Server.BodyLimit),
)
// Basic API
api.Get("/env", deps.HandleEnv)
api.Get("/scripts", deps.HandleScripts)
api.Get("/settings", deps.HandleGetSettings)
api.Patch("/settings", deps.HandleUpdateSettings)
api.Get("/storage", deps.HandleExportStorage)
api.Post("/storage", deps.HandleImportStorage)
// Source CRUD
api.Get("/sources", deps.HandleListSources)
api.Post("/sources", deps.HandleCreateSource)
api.Put("/sources", deps.HandleSortSources)
api.Post("/sort/sources", deps.HandleSortSourcesLegacy)
api.Get("/sources/:name", deps.HandleGetSource)
api.Patch("/sources/:name", deps.HandleUpdateSource)
api.Delete("/sources/:name", deps.HandleDeleteSource)
// Collection CRUD
api.Get("/collections", deps.HandleListCollections)
api.Post("/collections", deps.HandleCreateCollection)
api.Put("/collections", deps.HandleSortCollections)
api.Post("/sort/collections", deps.HandleSortCollectionsLegacy)
api.Get("/collections/:name", deps.HandleGetCollection)
api.Patch("/collections/:name", deps.HandleUpdateCollection)
api.Delete("/collections/:name", deps.HandleDeleteCollection)
// Template CRUD
api.Get("/templates", deps.HandleListTemplates)
api.Post("/templates", deps.HandleCreateTemplate)
api.Get("/templates/:name", deps.HandleGetTemplate)
api.Patch("/templates/:name", deps.HandleUpdateTemplate)
api.Delete("/templates/:name", deps.HandleDeleteTemplate)
// Recycle bin
api.Get("/recycle-bin", deps.HandleListRecycleBin)
api.Delete("/recycle-bin/:id", deps.HandleDeleteRecycleBinEntry)
api.Post("/recycle-bin/:id/restore", deps.HandleRestoreRecycleBinEntry)
// Preview
api.Post("/preview/source", deps.HandlePreviewSource)
api.Post("/preview/collection", deps.HandlePreviewCollection)
// Download links
api.Get("/link/source/:name", deps.HandleLinkSource)
api.Get("/link/collection/:name", deps.HandleLinkCollection)
// Flow info
api.Get("/source/flow/:name", deps.HandleFlowInfo)
// Tool APIs
api.Post("/proxy/parse", deps.HandleProxyParse)
api.Post("/rule/parse", deps.HandleRuleParse)
api.Post("/utils/proxy-uri", deps.HandleProxyURI)
api.Post("/utils/node-info", deps.HandleNodeInfo)
api.Post("/utils/egress-info", deps.HandleEgressInfo)
// Public download routes — no admin token required, uses download token
app.Get("/sources/:name/:token", deps.HandleDownloadSource)
app.Get("/collections/:name/:token", deps.HandleDownloadCollection)
}
// success sends a success JSON response.
func success(c fiber.Ctx, data any) error {
return c.JSON(fiber.Map{"status": "success", "data": data})
}
// failed sends a failed JSON response.
func failed(c fiber.Ctx, message string, code int) error {
return c.Status(code).JSON(fiber.Map{
"status": "failed",
"error": fiber.Map{"code": code, "message": message},
})
}