- 新增 GET /api/v1/me/liked-assets 接口 - 新增 GET /api/v1/me/exhibited-assets 接口 - 新增 GetMyLikedAssets 和 GetMyExhibitedAssets RPC 方法 - 新增 ExhibitedAssetItemDTO 和 GetMyExhibitedAssetsResponseDTO - 前端新增 getUserLikedAssetsApi 和 getUserExhibitedAssetsApi(暂不实现) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
261 lines
11 KiB
Go
261 lines
11 KiB
Go
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, taskClient *client.Client, starbookClient *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
|
||
}
|
||
|
||
taskCtrl, err := controller.NewTaskController(taskClient)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
starbookCtrl, err := controller.NewStarbookController(starbookClient)
|
||
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) // 更新头像
|
||
me.GET("/liked-assets", socialCtrl.GetMyLikedAssets) // 获取我点赞的作品列表
|
||
me.GET("/exhibited-assets", galleryCtrl.GetMyExhibitedAssets) // 获取我展出的作品列表
|
||
}
|
||
|
||
// 账户管理路由(需要认证)
|
||
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) // 获取贡献点排名
|
||
}
|
||
|
||
// 任务相关路由(需要认证)
|
||
tasks := v1.Group("/tasks")
|
||
tasks.Use(middleware.AuthMiddleware())
|
||
{
|
||
tasks.GET("/daily", taskCtrl.GetDailyTasks) // 获取每日任务列表
|
||
tasks.POST("/report-event", taskCtrl.ReportEvent) // 上报任务事件
|
||
tasks.POST("/daily/claim", taskCtrl.ClaimDailyTask) // 领取单个每日任务
|
||
tasks.POST("/daily/claim-all", taskCtrl.ClaimAllDailyTasks) // 一键领取所有每日任务
|
||
tasks.POST("/guide/complete", taskCtrl.CompleteGuide) // 完成引导任务
|
||
tasks.GET("/onboarding/status", taskCtrl.GetOnboardingStatus) // 获取引导状态
|
||
tasks.POST("/onboarding/advance-stage", taskCtrl.AdvanceStage) // 进入下一引导阶段
|
||
tasks.POST("/onboarding/claim-reward", taskCtrl.ClaimOnboardingReward) // 领取引导阶段奖励
|
||
tasks.GET("/exhibition-revenue", taskCtrl.GetExhibitionRevenue) // 获取展示收益
|
||
tasks.POST("/exhibition-revenue/claim", taskCtrl.ClaimExhibitionRevenue) // 领取单条展示收益
|
||
tasks.POST("/exhibition-revenue/claim-all", taskCtrl.ClaimAllExhibitionRevenue) // 一键领取所有展示收益
|
||
}
|
||
|
||
// 星册相关路由(需要认证)
|
||
starbook := v1.Group("/starbook")
|
||
starbook.Use(middleware.AuthMiddleware())
|
||
{
|
||
starbook.GET("/home", starbookCtrl.GetStarbookHome) // 获取星册首页
|
||
starbook.GET("/items", starbookCtrl.GetStarbookItems) // 获取星册藏品列表
|
||
}
|
||
}
|
||
|
||
return r, nil
|
||
}
|