mirror of
https://gitee.com/wanwujie/sub2api
synced 2026-04-05 16:00:21 +08:00
Add a system-wide "Backend Mode" that disables user self-registration and self-service while keeping admin panel and API gateway fully functional. When enabled, only admin can log in; all user-facing routes return 403. Backend: - New setting key `backend_mode_enabled` with atomic cached reads (60s TTL) - BackendModeUserGuard middleware blocks non-admin authenticated routes - BackendModeAuthGuard middleware blocks registration/password-reset auth routes - Login/Login2FA/RefreshToken handlers reject non-admin when enabled - TokenPairWithUser struct for role-aware token refresh - 20 unit tests (middleware + service layer) Frontend: - Router guards redirect unauthenticated users to /login - Admin toggle in Settings page - Login page hides register link and footer in backend mode - 9 unit tests for router guard logic - i18n support (en/zh) 27 files changed, 833 insertions(+), 17 deletions(-) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
37 lines
1.2 KiB
Go
37 lines
1.2 KiB
Go
package routes
|
|
|
|
import (
|
|
"github.com/Wei-Shaw/sub2api/internal/handler"
|
|
"github.com/Wei-Shaw/sub2api/internal/server/middleware"
|
|
"github.com/Wei-Shaw/sub2api/internal/service"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// RegisterSoraClientRoutes 注册 Sora 客户端 API 路由(需要用户认证)。
|
|
func RegisterSoraClientRoutes(
|
|
v1 *gin.RouterGroup,
|
|
h *handler.Handlers,
|
|
jwtAuth middleware.JWTAuthMiddleware,
|
|
settingService *service.SettingService,
|
|
) {
|
|
if h.SoraClient == nil {
|
|
return
|
|
}
|
|
|
|
authenticated := v1.Group("/sora")
|
|
authenticated.Use(gin.HandlerFunc(jwtAuth))
|
|
authenticated.Use(middleware.BackendModeUserGuard(settingService))
|
|
{
|
|
authenticated.POST("/generate", h.SoraClient.Generate)
|
|
authenticated.GET("/generations", h.SoraClient.ListGenerations)
|
|
authenticated.GET("/generations/:id", h.SoraClient.GetGeneration)
|
|
authenticated.DELETE("/generations/:id", h.SoraClient.DeleteGeneration)
|
|
authenticated.POST("/generations/:id/cancel", h.SoraClient.CancelGeneration)
|
|
authenticated.POST("/generations/:id/save", h.SoraClient.SaveToStorage)
|
|
authenticated.GET("/quota", h.SoraClient.GetQuota)
|
|
authenticated.GET("/models", h.SoraClient.GetModels)
|
|
authenticated.GET("/storage-status", h.SoraClient.GetStorageStatus)
|
|
}
|
|
}
|