Backend • Introduced `validateExpiredTime` helper in `controller/redemption.go`; reused in both Add & Update endpoints to enforce “expiry time must not be earlier than now”, eliminating duplicated checks • Removed `RedemptionCodeStatusExpired` constant and all related references – expiry is now determined exclusively by the `expired_time` field for simpler, safer state management • Simplified `DeleteInvalidRedemptions`: deletes codes that are `used` / `disabled` or `enabled` but already expired, without relying on extra status codes • Controller no longer mutates `status` when listing or fetching redemption codes; clients derive expiry status from timestamp Frontend • Added reusable `isExpired` helper in `RedemptionsTable.js`; leveraged for: – status rendering (orange “Expired” tag) – action-menu enable/disable logic – row styling • Removed duplicated inline expiry logic, improving readability and performance • Adjusted toolbar layout: on small screens the “Clear invalid codes” button now wraps onto its own line, while “Add” & “Copy” remain grouped Result The codebase is now more maintainable, secure, and performant with no redundant constants, centralized validation, and cleaner UI behaviour across devices.
166 lines
7.7 KiB
Go
166 lines
7.7 KiB
Go
package router
|
|
|
|
import (
|
|
"one-api/controller"
|
|
"one-api/middleware"
|
|
|
|
"github.com/gin-contrib/gzip"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func SetApiRouter(router *gin.Engine) {
|
|
apiRouter := router.Group("/api")
|
|
apiRouter.Use(gzip.Gzip(gzip.DefaultCompression))
|
|
apiRouter.Use(middleware.GlobalAPIRateLimit())
|
|
{
|
|
apiRouter.GET("/setup", controller.GetSetup)
|
|
apiRouter.POST("/setup", controller.PostSetup)
|
|
apiRouter.GET("/status", controller.GetStatus)
|
|
apiRouter.GET("/uptime/status", controller.GetUptimeKumaStatus)
|
|
apiRouter.GET("/models", middleware.UserAuth(), controller.DashboardListModels)
|
|
apiRouter.GET("/status/test", middleware.AdminAuth(), controller.TestStatus)
|
|
apiRouter.GET("/notice", controller.GetNotice)
|
|
apiRouter.GET("/about", controller.GetAbout)
|
|
//apiRouter.GET("/midjourney", controller.GetMidjourney)
|
|
apiRouter.GET("/home_page_content", controller.GetHomePageContent)
|
|
apiRouter.GET("/pricing", middleware.TryUserAuth(), controller.GetPricing)
|
|
apiRouter.GET("/verification", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.SendEmailVerification)
|
|
apiRouter.GET("/reset_password", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.SendPasswordResetEmail)
|
|
apiRouter.POST("/user/reset", middleware.CriticalRateLimit(), controller.ResetPassword)
|
|
apiRouter.GET("/oauth/github", middleware.CriticalRateLimit(), controller.GitHubOAuth)
|
|
apiRouter.GET("/oauth/oidc", middleware.CriticalRateLimit(), controller.OidcAuth)
|
|
apiRouter.GET("/oauth/linuxdo", middleware.CriticalRateLimit(), controller.LinuxdoOAuth)
|
|
apiRouter.GET("/oauth/state", middleware.CriticalRateLimit(), controller.GenerateOAuthCode)
|
|
apiRouter.GET("/oauth/wechat", middleware.CriticalRateLimit(), controller.WeChatAuth)
|
|
apiRouter.GET("/oauth/wechat/bind", middleware.CriticalRateLimit(), controller.WeChatBind)
|
|
apiRouter.GET("/oauth/email/bind", middleware.CriticalRateLimit(), controller.EmailBind)
|
|
apiRouter.GET("/oauth/telegram/login", middleware.CriticalRateLimit(), controller.TelegramLogin)
|
|
apiRouter.GET("/oauth/telegram/bind", middleware.CriticalRateLimit(), controller.TelegramBind)
|
|
|
|
userRoute := apiRouter.Group("/user")
|
|
{
|
|
userRoute.POST("/register", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.Register)
|
|
userRoute.POST("/login", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.Login)
|
|
//userRoute.POST("/tokenlog", middleware.CriticalRateLimit(), controller.TokenLog)
|
|
userRoute.GET("/logout", controller.Logout)
|
|
userRoute.GET("/epay/notify", controller.EpayNotify)
|
|
userRoute.GET("/groups", controller.GetUserGroups)
|
|
|
|
selfRoute := userRoute.Group("/")
|
|
selfRoute.Use(middleware.UserAuth())
|
|
{
|
|
selfRoute.GET("/self/groups", controller.GetUserGroups)
|
|
selfRoute.GET("/self", controller.GetSelf)
|
|
selfRoute.GET("/models", controller.GetUserModels)
|
|
selfRoute.PUT("/self", controller.UpdateSelf)
|
|
selfRoute.DELETE("/self", controller.DeleteSelf)
|
|
selfRoute.GET("/token", controller.GenerateAccessToken)
|
|
selfRoute.GET("/aff", controller.GetAffCode)
|
|
selfRoute.POST("/topup", controller.TopUp)
|
|
selfRoute.POST("/pay", controller.RequestEpay)
|
|
selfRoute.POST("/amount", controller.RequestAmount)
|
|
selfRoute.POST("/aff_transfer", controller.TransferAffQuota)
|
|
selfRoute.PUT("/setting", controller.UpdateUserSetting)
|
|
}
|
|
|
|
adminRoute := userRoute.Group("/")
|
|
adminRoute.Use(middleware.AdminAuth())
|
|
{
|
|
adminRoute.GET("/", controller.GetAllUsers)
|
|
adminRoute.GET("/search", controller.SearchUsers)
|
|
adminRoute.GET("/:id", controller.GetUser)
|
|
adminRoute.POST("/", controller.CreateUser)
|
|
adminRoute.POST("/manage", controller.ManageUser)
|
|
adminRoute.PUT("/", controller.UpdateUser)
|
|
adminRoute.DELETE("/:id", controller.DeleteUser)
|
|
}
|
|
}
|
|
optionRoute := apiRouter.Group("/option")
|
|
optionRoute.Use(middleware.RootAuth())
|
|
{
|
|
optionRoute.GET("/", controller.GetOptions)
|
|
optionRoute.PUT("/", controller.UpdateOption)
|
|
optionRoute.POST("/rest_model_ratio", controller.ResetModelRatio)
|
|
}
|
|
channelRoute := apiRouter.Group("/channel")
|
|
channelRoute.Use(middleware.AdminAuth())
|
|
{
|
|
channelRoute.GET("/", controller.GetAllChannels)
|
|
channelRoute.GET("/search", controller.SearchChannels)
|
|
channelRoute.GET("/models", controller.ChannelListModels)
|
|
channelRoute.GET("/models_enabled", controller.EnabledListModels)
|
|
channelRoute.GET("/:id", controller.GetChannel)
|
|
channelRoute.GET("/test", controller.TestAllChannels)
|
|
channelRoute.GET("/test/:id", controller.TestChannel)
|
|
channelRoute.GET("/update_balance", controller.UpdateAllChannelsBalance)
|
|
channelRoute.GET("/update_balance/:id", controller.UpdateChannelBalance)
|
|
channelRoute.POST("/", controller.AddChannel)
|
|
channelRoute.PUT("/", controller.UpdateChannel)
|
|
channelRoute.DELETE("/disabled", controller.DeleteDisabledChannel)
|
|
channelRoute.POST("/tag/disabled", controller.DisableTagChannels)
|
|
channelRoute.POST("/tag/enabled", controller.EnableTagChannels)
|
|
channelRoute.PUT("/tag", controller.EditTagChannels)
|
|
channelRoute.DELETE("/:id", controller.DeleteChannel)
|
|
channelRoute.POST("/batch", controller.DeleteChannelBatch)
|
|
channelRoute.POST("/fix", controller.FixChannelsAbilities)
|
|
channelRoute.GET("/fetch_models/:id", controller.FetchUpstreamModels)
|
|
channelRoute.POST("/fetch_models", controller.FetchModels)
|
|
channelRoute.POST("/batch/tag", controller.BatchSetChannelTag)
|
|
channelRoute.GET("/tag/models", controller.GetTagModels)
|
|
}
|
|
tokenRoute := apiRouter.Group("/token")
|
|
tokenRoute.Use(middleware.UserAuth())
|
|
{
|
|
tokenRoute.GET("/", controller.GetAllTokens)
|
|
tokenRoute.GET("/search", controller.SearchTokens)
|
|
tokenRoute.GET("/:id", controller.GetToken)
|
|
tokenRoute.POST("/", controller.AddToken)
|
|
tokenRoute.PUT("/", controller.UpdateToken)
|
|
tokenRoute.DELETE("/:id", controller.DeleteToken)
|
|
}
|
|
redemptionRoute := apiRouter.Group("/redemption")
|
|
redemptionRoute.Use(middleware.AdminAuth())
|
|
{
|
|
redemptionRoute.GET("/", controller.GetAllRedemptions)
|
|
redemptionRoute.GET("/search", controller.SearchRedemptions)
|
|
redemptionRoute.GET("/:id", controller.GetRedemption)
|
|
redemptionRoute.POST("/", controller.AddRedemption)
|
|
redemptionRoute.PUT("/", controller.UpdateRedemption)
|
|
redemptionRoute.DELETE("/invalid", controller.DeleteInvalidRedemption)
|
|
redemptionRoute.DELETE("/:id", controller.DeleteRedemption)
|
|
}
|
|
logRoute := apiRouter.Group("/log")
|
|
logRoute.GET("/", middleware.AdminAuth(), controller.GetAllLogs)
|
|
logRoute.DELETE("/", middleware.AdminAuth(), controller.DeleteHistoryLogs)
|
|
logRoute.GET("/stat", middleware.AdminAuth(), controller.GetLogsStat)
|
|
logRoute.GET("/self/stat", middleware.UserAuth(), controller.GetLogsSelfStat)
|
|
logRoute.GET("/search", middleware.AdminAuth(), controller.SearchAllLogs)
|
|
logRoute.GET("/self", middleware.UserAuth(), controller.GetUserLogs)
|
|
logRoute.GET("/self/search", middleware.UserAuth(), controller.SearchUserLogs)
|
|
|
|
dataRoute := apiRouter.Group("/data")
|
|
dataRoute.GET("/", middleware.AdminAuth(), controller.GetAllQuotaDates)
|
|
dataRoute.GET("/self", middleware.UserAuth(), controller.GetUserQuotaDates)
|
|
|
|
logRoute.Use(middleware.CORS())
|
|
{
|
|
logRoute.GET("/token", controller.GetLogByKey)
|
|
|
|
}
|
|
groupRoute := apiRouter.Group("/group")
|
|
groupRoute.Use(middleware.AdminAuth())
|
|
{
|
|
groupRoute.GET("/", controller.GetGroups)
|
|
}
|
|
mjRoute := apiRouter.Group("/mj")
|
|
mjRoute.GET("/self", middleware.UserAuth(), controller.GetUserMidjourney)
|
|
mjRoute.GET("/", middleware.AdminAuth(), controller.GetAllMidjourney)
|
|
|
|
taskRoute := apiRouter.Group("/task")
|
|
{
|
|
taskRoute.GET("/self", middleware.UserAuth(), controller.GetUserTask)
|
|
taskRoute.GET("/", middleware.AdminAuth(), controller.GetAllTask)
|
|
}
|
|
}
|
|
}
|