topfans/backend/gateway/router/router.go
2026-04-08 01:30:58 +08:00

224 lines
9.1 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package router
import (
"dubbo.apache.org/dubbo-go/v3/client"
"github.com/gin-gonic/gin"
swaggerfiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
_ "github.com/topfans/backend/gateway/docs" // 导入 docs 包以初始化 Swagger
"github.com/topfans/backend/gateway/controller"
"github.com/topfans/backend/gateway/middleware"
)
// SetupRouter 设置路由
func SetupRouter(userClient *client.Client, socialClient *client.Client, assetClient *client.Client, galleryClient *client.Client, activityClient *client.Client) (*gin.Engine, error) {
r := gin.Default()
// 全局中间件
r.Use(middleware.CORSMiddleware())
r.Use(middleware.LoggerMiddleware())
// 健康检查
r.GET("/health", func(c *gin.Context) {
c.JSON(200, gin.H{
"status": "ok",
"service": "top-fans-gateway",
})
})
// Swagger UI - 使用默认配置,自动从 docs 包读取
swaggerHandler := ginSwagger.WrapHandler(swaggerfiles.Handler)
r.GET("/swagger/*any", swaggerHandler)
// 创建控制器
authCtrl, err := controller.NewAuthController(userClient)
if err != nil {
return nil, err
}
userCtrl, err := controller.NewUserController(userClient)
if err != nil {
return nil, err
}
socialCtrl, err := controller.NewSocialController(socialClient)
if err != nil {
return nil, err
}
assetCtrl, err := controller.NewAssetController(assetClient)
if err != nil {
return nil, err
}
galleryCtrl, err := controller.NewGalleryController(galleryClient, socialClient)
if err != nil {
return nil, err
}
rankingCtrl, err := controller.NewRankingController(assetClient)
if err != nil {
return nil, err
}
activityCtrl, err := controller.NewActivityController(activityClient)
if err != nil {
return nil, err
}
// API v1 路由组
v1 := r.Group("/api/v1")
{
// 认证相关路由(公开)
auth := v1.Group("/auth")
{
auth.POST("/register", authCtrl.Register) // 注册
auth.POST("/login", authCtrl.Login) // 登录
auth.POST("/validate", authCtrl.ValidateToken) // 验证 Token
auth.POST("/check-nickname", authCtrl.CheckNickname) // 检查昵称是否被注册
auth.POST("/check-mobile", authCtrl.CheckMobile) // 检查手机号是否被注册
}
// 认证相关路由(需要认证)
authProtected := v1.Group("/auth")
authProtected.Use(middleware.AuthMiddleware())
{
authProtected.GET("/me", userCtrl.GetCurrentUser) // 获取当前用户信息
authProtected.POST("/refresh", authCtrl.RefreshToken) // 刷新 Token
authProtected.POST("/logout", authCtrl.Logout) // 登出
}
// 用户相关路由(公开)
users := v1.Group("/users")
{
users.GET("/:user_id", userCtrl.GetUser) // 获取指定用户信息
}
// 粉丝档案相关路由(公开)
fanProfiles := v1.Group("/fan-profiles")
{
fanProfiles.GET("", userCtrl.GetFanProfile) // 获取指定粉丝档案query params
}
// 粉丝身份相关路由(公开)
fanIdentities := v1.Group("/fan-identities")
{
fanIdentities.GET("", userCtrl.GetFanIdentities) // 获取可选粉丝身份列表
}
// 当前用户相关路由(需要认证)
me := v1.Group("/me")
me.Use(middleware.AuthMiddleware())
{
me.GET("/profile", userCtrl.GetMyProfile) // 获取当前用户粉丝档案
me.PUT("/nickname", userCtrl.UpdateNickname) // 更新昵称
me.PUT("/avatar", userCtrl.UpdateAvatar) // 更新头像
}
// 账户管理路由(需要认证)
account := v1.Group("/account")
account.Use(middleware.AuthMiddleware())
{
account.POST("/password", userCtrl.UpdatePassword) // 更新密码
}
// 我的粉丝身份管理路由(需要认证)
myFanIdentities := v1.Group("/my/fan-identities")
myFanIdentities.Use(middleware.AuthMiddleware())
{
myFanIdentities.GET("", userCtrl.GetMyFanIdentities) // 获取我的粉丝身份列表
myFanIdentities.POST("", userCtrl.AddIdentity) // 添加粉丝身份
myFanIdentities.POST("/switch", userCtrl.SwitchIdentity) // 切换粉丝身份
}
// 社交功能路由(需要认证)
social := v1.Group("/social")
social.Use(middleware.AuthMiddleware())
{
// 用户搜索(用于加好友)
social.GET("/search-user", socialCtrl.SearchUserForFriend) // 查找用户信息
social.GET("/random-users", socialCtrl.GetRandomUsers) // 获取随机用户
social.GET("/users", socialCtrl.GetUsersPaged) // 获取分页用户列表
// 好友请求相关
social.POST("/friend-requests", socialCtrl.SendFriendRequest) // 发送好友请求
social.GET("/friend-requests", socialCtrl.GetFriendRequests) // 获取好友请求列表
social.POST("/friend-requests/handle", socialCtrl.HandleFriendRequest) // 处理好友请求
// 好友管理相关
social.GET("/friends", socialCtrl.GetFriendList) // 获取好友列表
social.DELETE("/friends", socialCtrl.DeleteFriend) // 删除好友
social.PUT("/friends/remark", socialCtrl.SetFriendRemark) // 设置好友备注
// 好友关系查询
social.GET("/friendship/check", socialCtrl.CheckFriendship) // 检查好友关系
social.GET("/friends/count", socialCtrl.GetFriendCount) // 获取好友数量
// 资产点赞操作(保留操作接口,查询状态已集成到资产详情)
social.POST("/assets/:asset_id/like", socialCtrl.LikeAsset) // 点赞资产
social.DELETE("/assets/:asset_id/like", socialCtrl.UnlikeAsset) // 取消点赞
// 注意GET /api/v1/assets/:asset_id 会返回 is_liked 字段,无需单独查询
}
// 资产相关路由(需要认证)
assets := v1.Group("/assets")
assets.Use(middleware.AuthMiddleware())
{
assets.GET("/oss/signature", assetCtrl.GetOSSUploadSignature) // 获取 OSS 上传签名(兼容旧接口)
assets.GET("/oss/upload-signature", assetCtrl.GetOSSUploadSignature) // 获取 OSS 上传签名(阶段一接口)
assets.GET("/oss/presigned-url", assetCtrl.GetOSSPresignedURL) // 获取 OSS 预签名URL用于读取单个文件
assets.GET("/oss/batch-presigned-urls", assetCtrl.GetOSSBatchPresignedURLs) // 批量获取 OSS 预签名URL用于读取目录下的图片
assets.POST("/upload", assetCtrl.UploadImage) // 上传图片
assets.POST("/mints/precreate", assetCtrl.PreCreateMintOrder) // 阶段一:预创建铸造订单(返回 order_id
assets.POST("/mints", assetCtrl.CreateMintOrder) // 创建铸造订单
assets.GET("/mints/:order_id", assetCtrl.GetMintOrder) // 查询铸造订单状态
assets.DELETE("/mints/:order_id", assetCtrl.CancelMintOrder) // 取消铸造订单
assets.POST("/mints/image/generation", assetCtrl.ImageGeneration) // 图生图
assets.GET("/me/items", assetCtrl.GetMyAssets) // 获取我的藏品列表
assets.GET("/:asset_id", assetCtrl.GetAsset) // 获取资产详情
assets.GET("/:asset_id/status", assetCtrl.GetAssetStatus) // 查询上链状态
}
// 展馆相关路由(需要认证)
galleries := v1.Group("/galleries")
galleries.Use(middleware.AuthMiddleware())
{
galleries.GET("/me", galleryCtrl.GetMyGallery) // 获取我的展馆
galleries.GET("/random", galleryCtrl.GetRandomGallery) // 获取随机玩家展馆(静态路由必须在参数路由之前)
galleries.GET("/:target_uid", galleryCtrl.GetUserGallery) // 获取他人展馆
galleries.POST("/place", galleryCtrl.PlaceAsset) // 在展位展示藏品
galleries.DELETE("/slots/:slot_id/asset", galleryCtrl.RemoveFromSlot) // 从展位移除资产(统一接口)
galleries.POST("/slots_unlock", galleryCtrl.UnlockSlot) // 解锁/购买新展位
}
// 我的展馆路由(需要认证)
mygalleries := v1.Group("/mygalleries")
mygalleries.Use(middleware.AuthMiddleware())
{
mygalleries.GET("", galleryCtrl.GetMyGallery) // 获取我的展馆
}
// 排行榜相关路由(需要认证)
rankings := v1.Group("/rankings")
rankings.Use(middleware.AuthMiddleware())
{
rankings.GET("/hot", rankingCtrl.GetHotRanking) // 获取热度排行榜
rankings.GET("/original", rankingCtrl.GetOriginalRanking) // 获取自制排行榜
}
// 活动相关路由(需要认证)
activities := v1.Group("/activities")
activities.Use(middleware.AuthMiddleware())
{
activities.GET("", activityCtrl.GetActivityList) // 获取活动列表
activities.GET("/:id", activityCtrl.GetActivity) // 获取活动详情
activities.GET("/:id/items", activityCtrl.GetActivityItems) // 获取活动道具列表
activities.GET("/:id/progress", activityCtrl.GetProgress) // 获取活动进度
activities.POST("/:id/purchase", activityCtrl.PurchaseItem) // 购买道具
activities.GET("/:id/ranking", activityCtrl.GetContributionRanking) // 获取贡献点排名
}
}
return r, nil
}