@@ -2,8 +2,10 @@ package handler
22
33import (
44 "errors"
5+ "fmt"
56 "log/slog"
67 "net/http"
8+ "slices"
79 "strconv"
810
911 "opencsg.com/csghub-server/common/errorx"
@@ -30,6 +32,69 @@ type UserHandler struct {
3032 user component.UserComponent
3133}
3234
35+ func hasUserRepoFilterQuery (ctx * gin.Context ) bool {
36+ filterKeys := []string {
37+ "search" , "sort" , "source" , "status" , "xnet_migration_status" ,
38+ "dataset_type" , "user_purchased" , "list_serverless" ,
39+ "tag_category" , "tag_name" , "tag_group" ,
40+ "model_tree" ,
41+ "model_params_min" , "model_params_max" ,
42+ "repo_size_min" , "repo_size_max" ,
43+ }
44+ for _ , key := range filterKeys {
45+ if _ , ok := ctx .GetQuery (key ); ok {
46+ return true
47+ }
48+ }
49+ return false
50+ }
51+
52+ func parseUserRepoFilter (ctx * gin.Context , owner , currentUser string ) (* types.RepoFilter , error ) {
53+ if ! hasUserRepoFilterQuery (ctx ) {
54+ return nil , nil
55+ }
56+
57+ filter := & types.RepoFilter {
58+ Tags : parseTagReqs (ctx ),
59+ Owner : owner ,
60+ Username : currentUser ,
61+ }
62+
63+ tree , err := parseTreeReqs (ctx )
64+ if err != nil {
65+ return nil , err
66+ }
67+ filter .Tree = tree
68+ filter = getFilterFromContext (ctx , filter )
69+ filter .SpaceSDK = ctx .Query ("sdk" )
70+
71+ if listServerless , err := strconv .ParseBool (ctx .Query ("list_serverless" )); err == nil {
72+ filter .ListServerless = listServerless
73+ }
74+
75+ filter .ModelParamsMin , filter .ModelParamsMax , err = parseFloatRangeFromContext (ctx , "model_params_min" , "model_params_max" )
76+ if err != nil {
77+ return nil , errorx .ReqParamInvalid (err , errorx .Ctx ().Set ("query" , "model_params_range" ))
78+ }
79+
80+ filter .RepoSizeMin , filter .RepoSizeMax , err = parseInt64RangeFromContext (ctx , "repo_size_min" , "repo_size_max" )
81+ if err != nil {
82+ return nil , errorx .ReqParamInvalid (err , errorx .Ctx ().Set ("query" , "repo_size_range" ))
83+ }
84+
85+ if ! slices .Contains (types .Sorts , filter .Sort ) {
86+ err := fmt .Errorf ("sort parameter must be one of %v" , types .Sorts )
87+ return nil , errorx .ReqParamInvalid (err , errorx .Ctx ().Set ("query" , "sort_filter" ))
88+ }
89+
90+ if filter .Source != "" && ! slices .Contains (types .Sources , filter .Source ) {
91+ err := fmt .Errorf ("source parameter must be one of %v" , types .Sources )
92+ return nil , errorx .ReqParamInvalid (err , errorx .Ctx ().Set ("query" , "source_filter" ))
93+ }
94+
95+ return filter , nil
96+ }
97+
3398// GetUserDatasets godoc
3499// @Security ApiKey
35100// @Summary Get user datasets
@@ -53,6 +118,12 @@ func (h *UserHandler) Datasets(ctx *gin.Context) {
53118
54119 req .Owner = ctx .Param ("username" )
55120 req .CurrentUser = httpbase .GetCurrentUser (ctx )
121+ req .Filter , err = parseUserRepoFilter (ctx , req .Owner , req .CurrentUser )
122+ if err != nil {
123+ slog .ErrorContext (ctx .Request .Context (), "Bad user datasets filter request format" , "error" , err )
124+ httpbase .BadRequestWithExt (ctx , err )
125+ return
126+ }
56127 req .Page = page
57128 req .PageSize = per
58129 ds , total , err := h .user .Datasets (ctx .Request .Context (), & req )
@@ -94,6 +165,12 @@ func (h *UserHandler) Models(ctx *gin.Context) {
94165
95166 req .Owner = ctx .Param ("username" )
96167 req .CurrentUser = httpbase .GetCurrentUser (ctx )
168+ req .Filter , err = parseUserRepoFilter (ctx , req .Owner , req .CurrentUser )
169+ if err != nil {
170+ slog .ErrorContext (ctx .Request .Context (), "Bad user models filter request format" , "error" , err )
171+ httpbase .BadRequestWithExt (ctx , err )
172+ return
173+ }
97174 req .Page = page
98175 req .PageSize = per
99176 ms , total , err := h .user .Models (ctx .Request .Context (), & req )
@@ -136,6 +213,12 @@ func (h *UserHandler) Codes(ctx *gin.Context) {
136213
137214 req .Owner = ctx .Param ("username" )
138215 req .CurrentUser = httpbase .GetCurrentUser (ctx )
216+ req .Filter , err = parseUserRepoFilter (ctx , req .Owner , req .CurrentUser )
217+ if err != nil {
218+ slog .ErrorContext (ctx .Request .Context (), "Bad user codes filter request format" , "error" , err )
219+ httpbase .BadRequestWithExt (ctx , err )
220+ return
221+ }
139222 req .Page = page
140223 req .PageSize = per
141224 ms , total , err := h .user .Codes (ctx .Request .Context (), & req )
@@ -178,6 +261,12 @@ func (h *UserHandler) Spaces(ctx *gin.Context) {
178261 req .SDK = ctx .Query ("sdk" )
179262 req .Owner = ctx .Param ("username" )
180263 req .CurrentUser = httpbase .GetCurrentUser (ctx )
264+ req .Filter , err = parseUserRepoFilter (ctx , req .Owner , req .CurrentUser )
265+ if err != nil {
266+ slog .ErrorContext (ctx .Request .Context (), "Bad user spaces filter request format" , "error" , err )
267+ httpbase .BadRequestWithExt (ctx , err )
268+ return
269+ }
181270 req .Page = page
182271 req .PageSize = per
183272 ms , total , err := h .user .Spaces (ctx .Request .Context (), & req )
@@ -950,6 +1039,12 @@ func (h *UserHandler) MCPServers(ctx *gin.Context) {
9501039
9511040 req .Owner = ctx .Param ("username" )
9521041 req .CurrentUser = httpbase .GetCurrentUser (ctx )
1042+ req .Filter , err = parseUserRepoFilter (ctx , req .Owner , req .CurrentUser )
1043+ if err != nil {
1044+ slog .ErrorContext (ctx .Request .Context (), "Bad user mcp servers filter request format" , "error" , err )
1045+ httpbase .BadRequestWithExt (ctx , err )
1046+ return
1047+ }
9531048 req .Page = page
9541049 req .PageSize = per
9551050 mcps , total , err := h .user .MCPServers (ctx .Request .Context (), & req )
@@ -992,6 +1087,12 @@ func (h *UserHandler) Skills(ctx *gin.Context) {
9921087
9931088 req .Owner = ctx .Param ("username" )
9941089 req .CurrentUser = httpbase .GetCurrentUser (ctx )
1090+ req .Filter , err = parseUserRepoFilter (ctx , req .Owner , req .CurrentUser )
1091+ if err != nil {
1092+ slog .ErrorContext (ctx .Request .Context (), "Bad user skills filter request format" , "error" , err )
1093+ httpbase .BadRequestWithExt (ctx , err )
1094+ return
1095+ }
9951096 req .Page = page
9961097 req .PageSize = per
9971098 skills , total , err := h .user .Skills (ctx .Request .Context (), & req )
0 commit comments