Files

276 lines
11 KiB
Go
Raw Permalink Normal View History

2026-07-03 15:58:29 +08:00
// Package api 定义API路由
package api
import (
"seeyon-filesystem/config"
"seeyon-filesystem/controller"
"seeyon-filesystem/middleware"
"github.com/gin-gonic/gin"
)
// SetupRouter 初始化并配置所有路由
func SetupRouter() *gin.Engine {
cfg := config.AppConfig
r := gin.Default()
// 全局中间件
r.Use(middleware.CORS())
r.Use(middleware.UTF8ContentType())
r.Use(middleware.TrafficMonitor()) // 流量监控
r.Use(middleware.IPBlacklistMiddleware()) // IP黑名单
r.Use(middleware.OperationLogger()) // 操作日志
// 静态文件服务(本地存储的文件)
r.Static("/storage", cfg.Storage.LocalBasePath)
// 健康检查
r.GET("/health", func(c *gin.Context) {
c.JSON(200, gin.H{"status": "ok"})
})
// 初始化控制器
authCtrl := controller.NewAuthController()
fileCtrl := controller.NewFileController()
accessCtrl := controller.NewFileAccessController()
folderCtrl := controller.NewFolderController()
shareCtrl := controller.NewShareController()
ssoCtrl := controller.NewSSOController()
permCtrl := controller.NewPermissionController()
logCtrl := controller.NewLogController()
backupCtrl := controller.NewBackupController()
adminCtrl := controller.NewAdminController()
storageCtrl := controller.NewStorageController()
assignCtrl := controller.NewStorageAssignController()
chunkCtrl := controller.NewChunkUploadController()
monitorCtrl := controller.NewMonitorController()
openCtrl := controller.NewOpenAPIController()
2026-07-10 17:33:33 +08:00
openFileCtrl := controller.NewOpenAPIFileController()
2026-07-03 15:58:29 +08:00
// API路由组
api := r.Group("/api")
{
// ============ 认证 (无需登录) ============
auth := api.Group("/auth")
{
auth.POST("/login", authCtrl.Login)
2026-07-10 17:33:33 +08:00
auth.POST("/app-login", authCtrl.AppLogin)
2026-07-03 15:58:29 +08:00
auth.POST("/register", authCtrl.Register)
}
// ============ SSO (无需登录) ============
sso := api.Group("/sso")
{
sso.GET("/providers", ssoCtrl.GetProviders) // 获取SSO提供商列表
sso.GET("/auth/url", ssoCtrl.GetAuthURL) // 获取授权跳转URL
sso.GET("/callback", ssoCtrl.Callback) // SSO回调(GET, 重定向)
sso.POST("/callback", ssoCtrl.CallbackJSON)
}
// ============ 开放API (无需登录, OA调用) ============
openapi := api.Group("/openapi")
{
openapi.POST("/token/validate", openCtrl.ValidateToken)
openapi.POST("/token/generate", openCtrl.GenerateTestToken)
2026-07-10 17:33:33 +08:00
// 文件操作API (需要JWT认证)
openapi.Use(middleware.JWTAuth(cfg.JWT.Secret))
{
// 分页查询文件夹内容
openapi.GET("/files", openFileCtrl.ListByFolder)
// 按名称搜索
openapi.GET("/files/search", openFileCtrl.SearchTree)
// 下载/预览
openapi.GET("/files/:id/download", openFileCtrl.Download)
openapi.GET("/files/:id/preview", openFileCtrl.Preview)
// 分片上传
openapi.POST("/files/upload/init", openFileCtrl.ChunkUploadInit)
openapi.PUT("/files/upload/chunk/:uploadId/:index", openFileCtrl.ChunkUpload)
openapi.POST("/files/upload/merge/:uploadId", openFileCtrl.ChunkMerge)
openapi.GET("/files/upload/progress/:uploadId", openFileCtrl.ChunkProgress)
}
2026-07-03 15:58:29 +08:00
}
// ============ 需要登录的路由 ============
protected := api.Group("")
protected.Use(middleware.JWTAuth(cfg.JWT.Secret))
{
// 用户信息
protected.GET("/auth/profile", authCtrl.GetProfile)
protected.GET("/auth/permissions", permCtrl.GetUserPermissions)
protected.PUT("/auth/password", authCtrl.ChangePassword)
2026-07-18 10:52:32 +08:00
protected.POST("/auth/logout", authCtrl.Logout)
protected.GET("/auth/sessions", authCtrl.GetSessions)
2026-07-03 15:58:29 +08:00
protected.GET("/user/storage-info", assignCtrl.GetMyStorageInfo)
// 文件管理
file := protected.Group("/file")
{
file.POST("/upload", middleware.RequirePermission("file:upload"), fileCtrl.Upload)
// 分片上传
file.POST("/upload/init", middleware.RequirePermission("file:upload"), chunkCtrl.Init)
file.PUT("/upload/chunk/:uploadId/:index", middleware.RequirePermission("file:upload"), chunkCtrl.UploadChunk)
2026-07-10 17:33:33 +08:00
file.POST("/upload/chunk/:uploadId/:index/confirm", middleware.RequirePermission("file:upload"), chunkCtrl.ConfirmChunk)
2026-07-03 15:58:29 +08:00
file.POST("/upload/merge/:uploadId", middleware.RequirePermission("file:upload"), chunkCtrl.Merge)
file.GET("/upload/progress/:uploadId", chunkCtrl.Progress)
file.DELETE("/upload/:uploadId", chunkCtrl.Cancel)
file.GET("/info", fileCtrl.GetByKey) // 根据fileKey查询
file.GET("/search", fileCtrl.Search)
file.GET("/trash", fileCtrl.ListTrashed)
file.GET("/:id", fileCtrl.GetByID)
file.GET("/:id/download", fileCtrl.Download) // 直接下载文件流
file.GET("/:id/download-url", fileCtrl.GetDownloadURL) // 获取下载链接
file.GET("/:id/preview", fileCtrl.Preview) // 预览文件流
file.GET("/:id/preview-url", fileCtrl.GetPreviewURL) // 获取预览链接
file.GET("/:id/access", accessCtrl.Access) // 统一访问(自动选择模式)
file.GET("/:id/access-url", accessCtrl.GetAccessURL) // 获取访问URL
file.PUT("/:id/rename", middleware.RequirePermission("file:update"), fileCtrl.Rename)
file.POST("/:id/move", middleware.RequirePermission("file:update"), fileCtrl.Move)
file.DELETE("/:id", middleware.RequirePermission("file:delete"), fileCtrl.SoftDelete)
file.POST("/:id/restore", fileCtrl.Restore)
file.DELETE("/:id/permanent", middleware.RequirePermission("file:delete"), fileCtrl.HardDelete)
2026-07-10 17:33:33 +08:00
// 文件权限管理
file.GET("/:id/grant", fileCtrl.ListPermissions)
file.POST("/:id/grant", middleware.RequirePermission("file:grant"), fileCtrl.GrantPermission)
file.DELETE("/:id/grant/:permId", middleware.RequirePermission("file:grant"), fileCtrl.RevokePermission)
2026-07-03 15:58:29 +08:00
}
// 文件夹管理
folder := protected.Group("/folder")
{
folder.POST("", middleware.RequirePermission("file:create"), folderCtrl.Create)
2026-07-10 17:33:33 +08:00
folder.GET("/by-bizid/:bizid", folderCtrl.GetByBizID)
2026-07-03 15:58:29 +08:00
folder.GET("/:id/children", folderCtrl.ListChildren)
folder.GET("/root", func(c *gin.Context) {
c.Params = append(c.Params, gin.Param{Key: "id", Value: "root"})
folderCtrl.ListChildren(c)
})
folder.PUT("/:id/rename", middleware.RequirePermission("file:update"), folderCtrl.Rename)
folder.DELETE("/:id", middleware.RequirePermission("file:delete"), folderCtrl.Delete)
}
// 分享管理
share := protected.Group("/share")
{
share.POST("", middleware.RequirePermission("share:create"), shareCtrl.Create)
share.GET("", shareCtrl.ListMyShares)
share.DELETE("/:id", shareCtrl.Cancel)
}
}
// ============ 管理员接口 ============
admin := api.Group("/admin")
admin.Use(middleware.JWTAuth(cfg.JWT.Secret))
admin.Use(middleware.AdminAuth())
{
// 角色管理
admin.GET("/roles", permCtrl.ListRoles)
admin.POST("/roles", permCtrl.CreateRole)
admin.PUT("/roles/:id", permCtrl.UpdateRole)
admin.DELETE("/roles/:id", permCtrl.DeleteRole)
admin.PUT("/roles/:id/permissions", permCtrl.SetRolePermissions)
// 权限管理
admin.GET("/permissions", permCtrl.ListPermissions)
admin.POST("/permissions", permCtrl.CreatePermission)
admin.DELETE("/permissions/:id", permCtrl.DeletePermission)
// 用户管理
admin.GET("/users", adminCtrl.ListUsers)
admin.POST("/users", adminCtrl.CreateUser)
admin.PUT("/users/:id", adminCtrl.UpdateUser)
admin.DELETE("/users/:id", adminCtrl.DeleteUser)
admin.PUT("/users/:id/password", adminCtrl.ResetPassword)
admin.PUT("/users/:id/roles", permCtrl.SetUserRoles)
// 存储策略管理
admin.GET("/storage-policies", adminCtrl.ListStoragePolicies)
admin.POST("/storage-policies", adminCtrl.CreateStoragePolicy)
admin.PUT("/storage-policies/:id", adminCtrl.UpdateStoragePolicy)
admin.DELETE("/storage-policies/:id", adminCtrl.DeleteStoragePolicy)
admin.POST("/storage-policies/:id/test", adminCtrl.TestStoragePolicy) // 测试已保存策略
admin.POST("/storage-policies/test", adminCtrl.TestNewStoragePolicy) // 测试新配置
// 组织架构管理
admin.GET("/departments", adminCtrl.ListDepartments)
admin.POST("/departments", adminCtrl.CreateDepartment)
admin.PUT("/departments/:id", adminCtrl.UpdateDepartment)
admin.DELETE("/departments/:id", adminCtrl.DeleteDepartment)
// SSO提供商管理
admin.GET("/sso/providers", ssoCtrl.AdminListProviders)
admin.GET("/sso/providers/:id", ssoCtrl.AdminGetProvider)
admin.POST("/sso/providers", ssoCtrl.AdminCreateProvider)
admin.PUT("/sso/providers/:id", ssoCtrl.AdminUpdateProvider)
admin.PUT("/sso/providers/:id/toggle", ssoCtrl.AdminToggleProvider)
admin.DELETE("/sso/providers/:id", ssoCtrl.AdminDeleteProvider)
// CDN/存储设置
admin.GET("/settings/cdn", storageCtrl.GetCDNConfig)
admin.PUT("/settings/cdn", storageCtrl.UpdateCDNConfig)
// 存储策略分配
admin.GET("/storage-assignments", assignCtrl.ListAssignments)
admin.POST("/storage-assignments/default", assignCtrl.SetDefault)
admin.POST("/storage-assignments/user", assignCtrl.AssignToUser)
admin.POST("/storage-assignments/role", assignCtrl.AssignToRole)
admin.PUT("/storage-assignments/:id", assignCtrl.UpdateAssignment)
admin.DELETE("/storage-assignments/:id", assignCtrl.DeleteAssignment)
// 流量监控
admin.GET("/monitor/traffic", monitorCtrl.GetTrafficStats)
admin.GET("/monitor/requests", monitorCtrl.GetRecentRequests)
admin.GET("/monitor/storage", monitorCtrl.GetStorageStats)
2026-07-10 17:33:33 +08:00
admin.GET("/monitor/logs", monitorCtrl.GetSystemLogs)
2026-07-03 15:58:29 +08:00
// IP黑名单
admin.GET("/blacklist", monitorCtrl.GetBlacklist)
admin.PUT("/blacklist", monitorCtrl.SetBlacklist)
admin.POST("/blacklist", monitorCtrl.AddBlockedIP)
admin.DELETE("/blacklist/:ip", monitorCtrl.RemoveBlockedIP)
// 开放平台应用管理
admin.GET("/apps", openCtrl.ListApps)
admin.POST("/apps", openCtrl.CreateApp)
admin.DELETE("/apps/:id", openCtrl.DeleteApp)
admin.PUT("/apps/:id/toggle", openCtrl.ToggleApp)
admin.PUT("/apps/:id/users", openCtrl.BindUsers)
admin.DELETE("/apps/:id/users/:userId", openCtrl.UnbindUser)
// 操作日志
admin.GET("/logs", logCtrl.List)
admin.GET("/logs/stats", logCtrl.Stats)
admin.POST("/logs/clean", logCtrl.Clean)
// 备份管理
admin.GET("/backup/policies", backupCtrl.ListPolicies)
admin.POST("/backup/policies", backupCtrl.CreatePolicy)
admin.DELETE("/backup/policies/:id", backupCtrl.DeletePolicy)
admin.PUT("/backup/policies/:id/toggle", backupCtrl.TogglePolicy)
admin.POST("/backup/execute/:id", backupCtrl.ExecuteBackup)
admin.GET("/backup/logs", backupCtrl.ListLogs)
admin.GET("/backup/backups", backupCtrl.ListBackups)
admin.POST("/backup/restore/:logId", backupCtrl.Restore)
2026-07-18 10:52:32 +08:00
// 授权管理
admin.GET("/license", adminCtrl.GetLicense)
admin.POST("/license/generate", adminCtrl.GenerateLicense)
2026-07-03 15:58:29 +08:00
}
// ============ 分享公开访问 (无需登录) ============
s := api.Group("/s")
{
s.GET("/:code", shareCtrl.GetShareInfo)
s.POST("/:code/verify", shareCtrl.VerifySharePassword)
s.GET("/:code/preview", shareCtrl.PreviewShareFile)
s.GET("/:code/download", shareCtrl.DownloadShareFile)
s.GET("/:code/access", accessCtrl.AccessByShare)
}
}
return r
}